lxml'无' type不是None

时间:2014-09-18 16:47:10

标签: python lxml

我想将我设置为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相同。

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

对于那些想要了解isisinstance之间差异的人,我们已经讨论了here

1 个答案:

答案 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):