【问题标题】:Why does bool(xml.etree.ElementTree.Element) evaluate to False?为什么 bool(xml.etree.ElementTree.Element) 评估为 False?
【发布时间】:2013-11-21 19:19:11
【问题描述】:
import xml.etree.ElementTree as ET
e = ET.Element('Brock',Role="Bodyguard")
print bool(e)

为什么xml.etree.ElementTree.Element 被视为False

我知道我可以通过if e is not None 来检查是否存在。但我强烈希望bool(e) 会返回True

【问题讨论】:

  • 我也会。当我今天早上发现同样的行为并很高兴找到这个帖子时,我真的很惊讶。

标签: python boolean


【解决方案1】:

事实证明,Element 对象如果没有子对象,则被视为 False 值。

我在源代码中找到了这个:

def __nonzero__(self):
    warnings.warn(
        "The behavior of this method will change in future versions.  "
        "Use specific 'len(elem)' or 'elem is not None' test instead.",
        FutureWarning, stacklevel=2
        )
    return len(self._children) != 0 # emulate old behaviour, for now

即使是内联注释也同意你的看法——这种行为是有问题的;)

【讨论】:

  • 也许这应该类似于空列表是一个对象但不包含任何内容的事实。不过我不喜欢这样,因为这样的话,带有名称甚至属性(甚至里面的文本!)的元素都被认为是“空的”。
  • 完全正确。 list 只是一个容器,即由其元素定义。 Element 的情况并非如此,这正是您提到的原因。
  • 尽管我已经被同一个问题咬过一次(但两个月前,设法忘记了),但这种可疑的行为让我花费了半天的时间进行调试
  • 哦,伙计,这比你想象的还要糟糕。至少在源代码的最新版本中,包含此定义 gets overridden 的 Element 类由使用 C API 定义的替代版本发出警告。 (我发现这个是因为我要评论你应该如何启用记录器并使用logging.captureWarnings(True) 来查看此类警告,但在测试中意识到我,呃,当我这样做时看不到这个警告。)整个事情都是一团糟。
【解决方案2】:

来自文档:

http://docs.python.org/library/xml.etree.elementtree.html#element-objects

注意:没有子元素的元素将被测试为 False。此行为将在未来版本中更改。改用特定的 len(elem) 或 elem is None 测试。

【讨论】:

    猜你喜欢
    • 2015-03-15
    • 2015-03-22
    • 1970-01-01
    • 2014-02-16
    • 2022-01-10
    • 2021-10-10
    • 2012-03-06
    • 1970-01-01
    相关资源
    最近更新 更多