Python the Hard Way ex48

时间:2017-07-27 21:36:56

标签: python python-2.7 error-handling automated-tests

我无法获得以下代码以便正确测试。 test_errors()函数没有正常工作,但我觉得我已经正确设置了我的代码。第25行是我认为可行的,但我没有运气。

Line25:

elif i not in direction or verb or stop or noun:
   scan_result = scan_result + [('error', i)]

整个代码:

direction = ('north', 'south', 'east', 'west', 'up', 'down', 'left', 'right', 'back')
verb = ('go', 'stop', 'kill', 'eat')
stop = ('the', 'in', 'of', 'from', 'at', 'it')
noun = ('door', 'bear', 'princess', 'cabinet')
lexicon = {direction: 'direction',
       verb: 'verb',
       stop: 'stop',
       noun: 'noun',
       }


def scan(user_input):
    words = user_input.split()
    scan_result = []
    try:
        for i in words:
            if i.isdigit():
                scan_result = scan_result + [('number', int(i))]
            elif i.lower() in direction or verb or stop or noun:
                for j in lexicon:
                    for k in j:
                        if i.lower() == k:
                            scan_result = scan_result + [(lexicon[j], i)]
            elif i not in direction or verb or stop or noun:
                scan_result = scan_result + [('error', i)]
        return scan_result
    except ValueError:
        return None

test_error功能:

def test_errors():
    assert_equal(lexicon.scan("ASDFADFASDF"), [('error', 'ASDFADFASDF')])
    result = lexicon.scan("bear IAS princess")
    assert_equal(result, [('noun', 'bear')
                          ('error', 'IAS'),
                          ('noun', 'princess')])

3 个答案:

答案 0 :(得分:4)

更改第24行以将所有4个元组连接成一个元组:

elif i not in direction + verb + stop + noun:

如果需要,您可以将所有4个元组存储到单个变量中,但它应该检查它们是否存在于任何变量中。

答案 1 :(得分:1)

您可以通过以下内容替换有罪行,但您需要替换两个elif语句,

测试动词,stop和noun将始终为True,因为您将它们声明为元组,并且它们包含值(or关键字开始一个新表达式,它不添加单词组)

elif (i not in direction  
    or i not in verb 
    or i not in stop
    or i not in noun):

此外,您应该将这组单词声明为集合,对于“in test”

更好

答案 2 :(得分:1)

代码中的错误不是第25行而是第20行。只是检查变量将返回True,除非变量是None或Falsey。因此,当您执行if verb时,如果将verb设置为元组,则评估为True。由于您的第一个elif求值为True,所以块被执行并且代码继续在if..elif..else之外而不评估第二个elif,即第三个条件,它会受到影响来自与第一个elif相同的问题。这是python试图找到一个True条件,一旦找到一个,它就会停止检查是否有其他条件。

您想要检查该字词是direction还是verb还是stop还是noun。遗憾的是,Python中不存在either..or模式。

检查的正确和pythonic方式如下:

elif i.lower() in direction + verb + stop + noun: ... elif i not in direction + verb + stop + noun: ...

此外,您的test_errors功能稍有不正确。 lexicondictscan是一个函数,两者是分开的,因此您无法调用lexicon.scan()。它应该只是scan()

assert_equal(scan("ASDFADFASDF"), [('error', 'ASDFADFASDF')])