【问题标题】:Check if xml ElementTree node is None/False [duplicate]检查xml ElementTree节点是否为None/False [重复]
【发布时间】:2014-06-29 11:20:45
【问题描述】:

简单地检查变量myvar是否具有非无值是否安全:

if myvar:
    print('Not None detected')

我问这个是因为我有一个变量,并且正在通过简单的if variable: 检查变量是否不是None,但检查失败了。该变量包含一些数据,但在 if 检查中评估为 False。

完整代码:

from xml.etree import ElementTree as ElementTree

root = ElementTree.fromstring('Some xml string')

parameters = root.find('Some Tag')

udh = parameters.find('UDH')

if udh and udh.text:  # In this line the check is failing, though the udh variable has value: <Element 'UDH' at 0x7ff614337208>
    udh = udh.text
    # Other code
else:
    print('No UDH!')  # Getting this output

【问题讨论】:

  • 这实际上是错误的。 if myvar: 假设 myvarNone 实际上不会评估为 True,因此您的样本将无法工作。但是,最好使用以下形式:if myvar is not None:if myvar is None:
  • 您的检查不是因为 udh 中没有文本而失败吗?它可能是一个空的 XML 节点。
  • @Midnighter 我确定我的 udh 节点中有文本。
  • @Midnighter 但它没有任何子节点。这是否有可能被评估为 False?

标签: python


【解决方案1】:

没有子节点的ElementTree 行为与标准 Python 实践背道而驰。一般来说,在 if 条件中使用变量并假设布尔值是合理的是安全的。在这种情况下,正如您亲身经历的那样,您必须进行更明确的检查。

【讨论】:

    【解决方案2】:

    在 Python 中,对象的布尔值(真值)不一定等于 None。该假设的正确性取决于您的对象是否具有正确定义的正确方法。至于 Python 2.7:

    object.__nonzero__(self)

    调用实现真值检测和内置操作bool();应该返回FalseTrue,或它们的整数等价物01。如果未定义此方法,则调用 __len__()(如果已定义),并且如果对象的结果为非零,则该对象被视为真。如果一个类既没有定义__len__() 也没有定义__nonzero__(),那么它的所有实例都被认为是真的。

    还可以查看 PEP 8,它为此问题提供了指导(重点是我的):

    应始终使用isis notNone 之类的单例进行比较,而不是相等运算符。

    另外,当你真正的意思是if x is not None时,请注意不要写if x——例如。在测试默认为 None 的变量或参数是否设置为其他值时。 另一个值可能具有在布尔上下文中可能为 false 的类型(例如容器)!

    因此,为了安全地测试您是否拥有Nonenot None,您应该专门使用:

    if myvar is None: 
        pass
    elif myvar is not None:
        pass
    

    xml.etree.ElementTree.Element 的情况下,布尔评估的语义不同于对象的None-ness:

    供参考:

    【讨论】:

    • pep 8 对此也有意见:另外,当你真正的意思是if x is not None时,请注意不要写if x
    • @JonasWielicki 感谢您的参考!
    • 非常感谢您的回答。你能说出在 Python 3 中评估变量引用的值是否可以是布尔值时发生了什么吗?
    • @giga 看看这个在 Python 3 中进行真值测试:docs.python.org/3/library/stdtypes.html#truth-value-testing
    【解决方案3】:

    对于您的情况,自ElementTree returns False to the __nonzero__ test检查是否已找到该元素是安全的

    但是,正如文档所说,如果您只想检查未找到该元素的情况,最好使用is None 明确检查:

    注意:由于 Element 对象没有定义 nonzero() 方法,没有子元素的元素将被测试为 False。

    element = root.find('foo')
    
    if not element: # careful!
        print "element not found, or element has no subelements"
    
    if element is None:
        print "element not found"
    

    提醒一下,object.__nonzero__ 用于值测试和bool() 操作。

    【讨论】:

      猜你喜欢
      • 2011-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-02
      • 2016-08-29
      • 1970-01-01
      相关资源
      最近更新 更多