我无法获得以下代码以便正确测试。 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')])
答案 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
功能稍有不正确。 lexicon
是dict
而scan
是一个函数,两者是分开的,因此您无法调用lexicon.scan()
。它应该只是scan()
。
assert_equal(scan("ASDFADFASDF"), [('error', 'ASDFADFASDF')])