namedtuple
定義後に新しいフィールドをに追加することはできません。唯一の方法は、新しいテンプレートを作成して新しい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)