lxml'None'类型不是None

Wal*_*Red 3 python xml lxml

我想比较我设置的变量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.aNone实例.另一方面,它们的类型和is返回不匹配,false因此它不能与实例相同None.

  • 为什么?
  • 除了使用我别无选择==吗?

对于那些谁想要知道更多关于差异之间isisinstance出现了讨论关于它在这里.

Mar*_*ers 9

您正在使用lxml.objectifyAPI ; 此API使用特殊对象来表示None客观化的XML树中的值.当您分配Nonexml.a,lxml存储该特殊对象时,它可以将其转换为XML文档中的XML元素.

你有什么是不是None单.你有一个lxml.objectify.NoneElement的实例.

您可以测试该元素的类型:

from lxml.objectify import NoneElement

if isinstance(xml.a, NoneElement):
Run Code Online (Sandbox Code Playgroud)