Python的艰难之路ex48
我无法正确测试下面的代码。test_errors()函数工作不正常,但我觉得我的代码设置正确。第25行是我认为可行的,但我没有任何运气 第25行:Python的艰难之路ex48,python,python-2.7,error-handling,automated-tests,Python,Python 2.7,Error Handling,Automated Tests,我无法正确测试下面的代码。test_errors()函数工作不正常,但我觉得我的代码设置正确。第25行是我认为可行的,但我没有任何运气 第25行: 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', 'righ
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
测试错误函数:
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')])
您可以用以下内容替换有罪线,但需要替换两个elif语句 测试动词、停止和名词将始终为真,因为您将它们声明为元组,并且它们包含值(关键字begin a new expression不是添加词组)
您还应该将这组单词声明为集合,最好将“in test”更改为第24行,将所有4个元组连接成一个元组:
elif i not in direction + verb + stop + noun:
如果需要,您可以将所有4个元组存储到单个变量中,但它应该检查它们中是否存在元组 代码中的错误不是第25行,而是第20行。只要检查一个变量就会返回True,除非该变量是
None
或false。因此,当您执行操作时,如果verb
,如果verb
设置为元组,则它将计算为True
。由于第一个elif
的计算结果为True
,因此执行块,代码继续在if..elif..else之外运行,而不计算第二个elif
即第三个条件,该条件与第一个elif
的问题相同。这就是python试图找到一个真实的条件,一旦找到一个,它就会停止检查任何其他条件
您要检查单词是否在方向
或动词
或停止
或名词
。遗憾的是,或者..或者
模式在Python中并不存在
正确的检查方法如下:
elif i.lower()方向+动词+停止+名词:
...
如果i不在方向+动词+停止+名词:
...
另外,您的test\u errors
功能有点不正确lexicon
是一个dict
,而scan
是一个函数,两者是分开的,因此不能调用lexicon.scan()
。它应该是简单的scan()
assert_equal(扫描(“ASDFADFASDF”),[(“错误”,“ASDFADFASDF”)])
请:。这不是LPTHW支持论坛。我运行了您的代码,通过执行打印扫描(“进入门”)
,它似乎返回了在您创建时已解析的元组列表。当我提供了错误的输入(单词列表中没有的任何内容)时,这些单词没有包含在结果中。i、 e.“熊公主”=>[('noun','bear'),('noun','princess')]Juanpa,将来一定会尝试。我真的不知道如何描述这个问题。桑妮,是的,这就是我的问题所在。如果有一个错误,它只是通过扫描愚蠢这不是完全准确。很多对象都是假的,它们不是None
,包括一个空元组。感谢您的精彩解释,这似乎是我遇到的问题。奇怪的是,第一个elif似乎工作正常。可能是因为isdigit()函数可以计算false,因为它查看元组是否为数字。我曾尝试将第二个elif嵌套在第一个elif下,但最终出现了相同的问题。该语句的计算结果为true。现在我知道为什么找不到解决方案了,我将进行一些故障排除。lexicon.scan函数,这是我作为新手时使用的。scan函数位于一个名为lexicon.py的文件中,它似乎也不起作用。我相信这是由于varagrawal在下面进一步解释的机制。第20行中的另一条elif语句被计算为true,因为有一个值,并且忽略了第25行中的elif语句。尝试了这个,似乎不太管用。我会出错,因为我无法调用元组。我希望这些是元组而不是集合。我认为您已经了解了元组评估为True的内容。@MaxStackhouse这只是一些建议,也许您需要在代码的另一部分使用元组,但它应该适用于给定的示例。如果你有一个大的单词列表,并且你在寻找性能,那么它的效率会更高。无论如何,谢谢你的反馈
elif i not in direction + verb + stop + noun: