通过以下方式检查变量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
答案 0 :(得分:5)
在Python中,对象的布尔(真值)值不一定等于None
。该假设的正确性取决于您的对象是否正确定义了正确的方法。至于Python 2.7:
object.
的__nonzero__
强>(self)
被要求实施真值测试和内置操作
bool()
;应该返回False
或True
,或等值整数0
或1
。如果未定义此方法,则调用__len__()
(如果已定义),如果对象的结果非零,则认为该对象为true。如果某个类既未定义__len__()
也未定义__nonzero__()
,则其所有实例都被视为true。
另请参阅PEP 8,它为此问题提供了指导(强调我的):
与
None
等单身人士的比较应始终使用is
或is not
,而不是等同运算符。另外,当你真正想要
if x
时,要小心写if x is not None
- 例如在测试默认为None
的变量或参数是否设置为其他值时。 另一个值可能有一个类型(例如容器)在布尔上下文中可能为false!
因此,要安全地测试您是否有None
或not 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()
操作。