1

我知道这个标题看起来很疯狂,但这是真的。这是我的困境。首先,我仍然是 Python 的初学者,所以请体谅。我正在尝试测试变量是否存在。现在变量来自一个用 yaml 解析的文件。每当我尝试这段代码时,

if not name['foo']:
    print "No name given."
    return False

Python 会按照您的预期执行并返回 false。但是,当我尝试将其更改为此代码时,

try:
    name['foo']
except:
    print "ERROR: No name given."
    raise

永远不会出现例外。我已经搜索和搜索,找不到任何可以向我解释这一点的问题或网站。我唯一的想法是解析器正在“欺骗”异常处理程序,但这对我来说真的没有意义。

我已确保我正在解析的文档的名称字段中没有空格。该字段具有以下格式:

*name: foo
*ver: bar

就像我说的那样,我确保 foo 以及行之间的任何空格都被完全删除。如果有人可以提供帮助,将不胜感激。

编辑:

我为 if 语句中的否定逻辑道歉。该功能必须经过一系列检查。我能想到的确保执行所有检查的最佳方法是在最后返回 true 并在任何单个检查失败时返回 false。

4

3 回答 3

1

一些东西:

  • 那不应该抛出异常!你name['foo']在两个地方做,并期待不同的行为。

  • name行为不像字典,如果False在第一个例子中你不会得到返回,你会得到一个异常。尝试这样做:

    name = {}
    name['foo'] 
    

    然后你会得到一个KeyError例外

  • 永远不要有except:障碍!始终捕获您所追求的特定异常,例如IndexError或其他

于 2013-06-05T15:03:30.087 回答
0

我不明白你为什么认为它会引发异常。密钥显然存在,否则第一个片段将不起作用。该键的值显然是一些 false-y 值,例如False,或。None[]''

于 2013-06-05T15:08:11.853 回答
0

Python 会按照您的预期执行并返回 false。

仅当字典中没有键(假设是字典)KeyError时才会抛出异常 ( )。name如果你这样做

if not name['foo']:

并且它不会抛出异常,那么这意味着它"foo"name但该值的计算结果为布尔值 false (它可以是False, None, 空字符串"", 空列表[], 空字典{}, 一些自定义对象等)。因此包装name['foo']try:except:没有意义的——关键就在那里。

于 2013-06-05T15:09:18.327 回答