我想比较我设置的变量None,它之前是一个字符串元素,is但它失败了.
当我将此变量与之比较None时==,它可以正常工作.
这是我正在谈论的变量:
print type(xml.a) -> <type 'lxml.objectify.StringElement'>
Run Code Online (Sandbox Code Playgroud)
因为我使用的一些库None作为默认参数(即def f(x=None)),我之前更改了我的nullstrings,如下所示:
if xml.a == '':
xml.a = None
Run Code Online (Sandbox Code Playgroud)
之后类型已更改为:
print type(xml.a) -> <type 'lxml.objectify.NoneElement'>
Run Code Online (Sandbox Code Playgroud)
哪个不一样:
print type(None) -> <type 'NoneType'>
Run Code Online (Sandbox Code Playgroud)
当我如上所述比较这个值时,我得到以下结果:
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'
Run Code Online (Sandbox Code Playgroud)
我已经知道,当比较不同实例的对象时,is返回false.但我的理解是我之前已经设置xml.a了None实例.另一方面,它们的类型和is返回不匹配,false因此它不能与实例相同None.
==吗?对于那些谁想要知道更多关于差异之间is并isinstance出现了讨论关于它在这里.
您正在使用lxml.objectifyAPI ; 此API使用特殊对象来表示None客观化的XML树中的值.当您分配None给xml.a,lxml存储该特殊对象时,它可以将其转换为XML文档中的XML元素.
你有什么是不是的None单.你有一个lxml.objectify.NoneElement类的实例.
您可以测试该元素的类型:
from lxml.objectify import NoneElement
if isinstance(xml.a, NoneElement):
Run Code Online (Sandbox Code Playgroud)