namedtuple
定义后不能向 a 添加新字段。唯一的方法是创建一个新模板并创建新namedtuple
实例。
分析
>>> from collections import namedtuple
>>> result = namedtuple('Result',['x','y'])
>>> result
<class '__main__.Result'>
result
不是元组,而是创建元组的类。
>>> result.x
<property object at 0x02B942A0>
你创建一个像这样的新元组:
>>> p = result(1, 2)
>>> p
Result(x=1, y=2)
>>> p.x
1
打印 中的值x
。p
>>> p.x = 5
Traceback (most recent call last):
File "<pyshell#10>", line 1, in <module>
p.x = 5
AttributeError: can't set attribute
这会引发错误,因为元组是不可变的。
>>> result.x = 5
>>> result
<class '__main__.Result'>
>>> result._fields
('x', 'y')
>>> p = result(1, 2)
>>> p
Result(x=1, y=2)
这不会改变任何事情。
>>> result.description = 'point'
>>> result
<class '__main__.Result'>
>>> result._fields
('x', 'y')
这也不会改变任何事情。
解决方案
>>> result = namedtuple('Result', ['x','y'])
>>> p = result(1, 2)
>>> p
Result(x=1, y=2)
>>> # I need one more field
>>> result = namedtuple('Result',['x','y','z'])
>>> p1 = result(1, 2, 3)
>>> p1
Result(x=1, y=2, z=3)
>>> p
Result(x=1, y=2)