我想将我设置为None
的变量(之前是字符串元素)与is
进行比较,但它失败了。
当我将此变量与None
与==
进行比较时,它可以正常工作。
这是我正在谈论的变量:
print type(xml.a) -> <type 'lxml.objectify.StringElement'>
因为我使用的某些库有None
作为默认参数(即def f(x=None)
),所以我之前更改了我的nullstrings:
if xml.a == '':
xml.a = None
之后类型已更改为:
print type(xml.a) -> <type 'lxml.objectify.NoneElement'>
与...不同:
print type(None) -> <type 'NoneType'>
当我如上所述比较这个值时,我得到以下结果:
if xml.a is None:
print 'what I expect'
else:
print 'what I do NOT expect' # sadly this one is printed
if xml.a == None:
print 'what I do NOT expect' # this one is printed again...
else:
print 'what I expect'
我已经知道,在比较不同实例的对象时,is
会返回false
。但我的理解是我之前已将xml.a
设置为None
实例。另一方面,他们的类型不匹配,is
返回false
,因此它不能与None
相同。
==
对于那些想要了解is
和isinstance
之间差异的人,我们已经讨论了here。
答案 0 :(得分:9)
您正在使用lxml.objectify
API;此API使用特殊对象来表示客观化的XML树中的None
值。当您将None
分配给xml.a
时,lxml
存储了该特殊对象,以便它可以将其转换为XML文档中的XML元素。
你拥有的是不 None
单身人士。您有一个lxml.objectify.NoneElement
class的实例。
您可以测试该元素的类型:
from lxml.objectify import NoneElement
if isinstance(xml.a, NoneElement):