繁体   English   中英

无法在Python 3中的ElementTree.Element实例上设置属性

[英]Can't set attributes on ElementTree.Element instance in Python 3

我不明白为什么在Python 3中我无法向ElementTree.Element实例添加一些属性。 这是区别:

在Python 2中:

Python 2.6.6 (r266:84292, Jun 18 2012, 14:18:47) 
[GCC 4.4.6 20110731 (Red Hat 4.4.6-3)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from xml.etree import ElementTree as ET
>>> el = ET.Element('table')
>>> el.foo = 50
>>> el.foo
50
>>> 

在Python 3中:

Python 3.3.0 (default, Sep 11 2013, 16:29:08) 
[GCC 4.4.6 20120305 (Red Hat 4.4.6-4)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from xml.etree import ElementTree as ET
>>> el = ET.Element('table')
>>> el.foo = 50
>>> el.foo
AttributeError: foo
>>> 

Python 2由发行版(CentOS)提供。 Python 3是从源代码编译而来的。

它是预期的行为,一个错误,还是我必须用一些额外的标志重新编译python 3?

更新

一些澄清:我试图在Python对象上设置属性,即在Element实例上。 不是XML属性( Element.attrib )。

当我尝试继承Element时,这个问题实际上就出现了。 这是一个例子:

>>> class Table(ET.Element):
...     def __init__(self):
...         super().__init__('table')
...         print('calling __init__')
...         self.foo = 50
... 
>>> t = Table()
calling __init__
>>> t.foo
Traceback (most recent call last):
  File "<input>", line 1, in <module>
AttributeError: 'Table' object has no attribute 'foo'
>>> 

这让我觉得Element类是以某种棘手的方式实例化的,但我无法弄清楚发生了什么。 因此问题。

这可能是有意的......看看无法设置对象类的属性 如果他们没有增强ElementTree在那段时间使用插槽而不是dict,我会感到惊讶。

不清楚你要做什么......你真的想设置python属性或XML属性吗? 如果是后者,你真的想这样做:

el = ET.Element('table')
el.set('foo', 50) 
#or
el.attrib['foo'] = 50

如果你真的想要添加python属性,你应该改为子类,并且可能提供你自己的Element / SubElement函数来提供'wrapped'元素而不是标准元素。

2016年6月4日更新:也许我的回答并不清楚,但这是你可能需要做的事情(我通常是python 2.7):

class Table(ET.Element):
    # Adding __slots__ gives it a known attribute to use    
    __slots__ = ('foo',)
    def __init__(self):
        super().__init__('table')
        print('calling __init__')
        self.foo = 50

由于3.3 ElementTree尝试导入c实现以提高效率,但是您无法在该实现上设置任意属性。 如果您每次都不想使用Set或Get方法,则应使用ET._Element_Py,这是Python实现。

根据Python 3文档 ,似乎现在唯一的出路是:

>>> from xml.etree import ElementTree as ET
>>> el = ET.Element('table')
>>> el.set("foo", 50)
>>> el.get("foo")
50
>>> el.attrib
{"foo": 50}

它也在Python 2.X下工作,但现在可能是强制性的。

此外, Python bug跟踪器中的一个有趣的票据 ,他们决定更改异常消息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM