Python的艰难之路ex48

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

我无法正确测试下面的代码。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', '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: