【问题标题】:Python the Hard Way ex48Python 艰难之路 ex48
【发布时间】:2017-07-27 21:36:56
【问题描述】:

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

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')])

【问题讨论】:

  • 请:make a relevant title。这不是 LPTHW 支持论坛。
  • 我通过执行print scan("go in the door") 运行了您的代码,它似乎返回了在您创建时已解析的元组列表。当我提供错误的输入(不在单词列表中的任何内容)时,这些单词不会包含在结果中。即“熊IAS公主”=> [('名词','熊'),('名词','公主')]
  • Juanpa,以后一定会尝试的。真的不知道如何描述问题。 Sunny,是的,这就是我遇到的问题。如果有错误,它只是默默地通过扫描

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


【解决方案1】:

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

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

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

【讨论】:

  • 这似乎也不起作用。我相信这是由于varagrawal在下面进一步解释的机制。第 20 行中的另一个 elif 语句被评估为真,因为存在一个值并忽略第 25 行的 elif 语句。
【解决方案2】:

代码中的错误不是第 25 行而是第 20 行。简单地检查变量将返回 True,除非变量是 None 或 Falsey。因此,当您执行if verb 时,如果将verb 设置为一个元组,它将评估为True。由于您的第一个 elif 评估为 True,因此该块被执行并且代码在 if..elif..else 之外继续运行,而不评估第二个 elif 即第三个条件,它与第一个elif。这是 python 试图找到一个 True 条件,一旦找到,它就会停止检查任何其他条件。

您想检查单词是否在directionverbstopnoun 中。遗憾的是,either..or 模式在 Python 中不存在。

正确的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')])

【讨论】:

  • 这并不完全准确。很多不是 None 的对象都是虚假的,包括一个空元组。
  • 感谢您的精彩解释,这似乎是我遇到的问题。这里奇怪的是第一个 elif 似乎工作正常。可能是因为 isdigit() 函数可以评估 false,因为它查看元组是否为数字。我尝试将第二个 elif 嵌套在第一个 elif 下,但最终遇到了同样的问题。该声明只是被评估为真。既然我知道为什么它无法找到解决方案,我将进行一些故障排除。 lexicon.scan 功能,那是我作为菜鸟的时候。扫描功能在一个名为 lexicon.py 的文件中,哎呀
【解决方案3】:

你可以用下面的代码替换有罪的行但是你需要替换两个 elif 语句,

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

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

另外你应该将这组词声明为集合,最好是“in test”

【讨论】:

  • 试过这个,似乎不太好我得到错误,因为我不能调用一个元组。我确实希望这些是元组而不是集合。我认为您对 Tuple 评估为 True..
  • @MaxStackhouse 这只是一些建议,也许您在代码的另一部分需要元组,但它应该适用于您给定的示例。如果你有一个大的单词列表,并且如果你正在寻找性能,它真的会更有效。无论如何,感谢您的反馈
猜你喜欢
  • 1970-01-01
  • 2016-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-06
  • 2011-12-04
  • 2016-06-28
相关资源
最近更新 更多