【问题标题】:Python: variable "tricking" try-exception, but works for if statementPython:变量“欺骗”尝试异常,但适用于 if 语句
【发布时间】:2013-06-01 08:17:01
【问题描述】:

我知道这个标题看起来很疯狂,但这是真的。这是我的困境。首先,我仍然是 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。

【问题讨论】:

  • "Python 会按照您的预期执行并返回 false"。如果name 是一个普通的字典,而"foo" 不是该字典中的键,我不希望它返回false。我期待一个KeyError。如果你想检查密钥是否存在,你应该使用if "foo" not in name
  • 您为什么希望它在 if 中返回 false 并自行引发异常?

标签: python parsing exception if-statement


【解决方案1】:

一些事情:

  • 这不应该引发异常!你在两个地方做name['foo'] 并期待不同的行为。

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

    name = {}
    name['foo'] 
    

    然后你会得到一个KeyError 异常

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

【讨论】:

  • 谢谢,当我读到你的第一个子弹时,我就知道我做了什么。我现在觉得很简单。
【解决方案2】:

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

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

if not name['foo']:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-22
      • 2012-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多