检查xml ElementTree节点是否为None / False

时间:2014-05-12 07:23:27

标签: python

通过以下方式检查变量myvar是否具有非 - None值是否安全?

if myvar:
    print('Not None detected')

我问这个是因为我有一个变量并且只是通过None检查变量是否不是if variable:,但是检查失败了。该变量包含一些数据,但在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

3 个答案:

答案 0 :(得分:5)

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

  

object. __nonzero__ (self)

     

被要求实施真值测试和内置操作bool();应该返回FalseTrue,或等值整数01。如果未定义此方法,则调用__len__()(如果已定义),如果对象的结果非零,则认为该对象为true。如果某个类既未定义__len__()也未定义__nonzero__(),则其所有实例都被视为true。

另请参阅PEP 8,它为此问题提供了指导(强调我的):

  

None等单身人士的比较应始终使用isis not,而不是等同运算符。

     

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

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

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

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

供参考:

答案 1 :(得分:2)

没有子节点的节点的ElementTree行为是与标准Python实践的臭名昭着的背离。通常,在if条件中使用变量并假设布尔值是合理的是安全的。在这种情况下,当您亲身经历时,您必须进行更明确的检查。

答案 2 :(得分:1)

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

但是,正如文档所说,如果您只想检查是否找不到该元素,最好使用is None进行明确检查:

  

警告:由于Element对象未定义非零()方法,因此没有子元素的元素将测试为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()操作。