1. ホーム
  2. python

[解決済み] PythonでMutableな名前付きタプルは存在するのか?

2022-05-17 23:54:33

質問

どなたか 名前付きタプル を修正するか、あるいは別のクラスを提供して、ミュータブルオブジェクトで動作するようにできますか?

主に可読性のために、私はこれを行うnamedtupleに似たものを希望します。

from Camelot import namedgroup

Point = namedgroup('Point', ['x', 'y'])
p = Point(0, 0)
p.x = 10

>>> p
Point(x=10, y=0)

>>> p.x *= 10
Point(x=100, y=0)

結果として得られるオブジェクトをpickleすることが可能でなければなりません。 また、名前付きタプルの特性上、表現されたときの出力の順序は、オブジェクトを構築するときのパラメータリストの順序と一致しなければなりません。

どのように解決するのですか?

に代わるミュータブルな方法があります。 collections.namedtuple - レコードクラス . PyPIからインストールすることができます。

pip3 install recordclass

と同じ API とメモリフットプリントを持っています。 namedtuple と同じで、代入をサポートしています(同様に高速化されるはずです)。例えば

from recordclass import recordclass

Point = recordclass('Point', 'x y')

>>> p = Point(1, 2)
>>> p
Point(x=1, y=2)
>>> print(p.x, p.y)
1 2
>>> p.x += 2; p.y += 3; print(p)
Point(x=3, y=5)

recordclass (0.5 以降) は typehints をサポートします。

from recordclass import recordclass, RecordClass

class Point(RecordClass):
   x: int
   y: int

>>> Point.__annotations__
{'x':int, 'y':int}
>>> p = Point(1, 2)
>>> p
Point(x=1, y=2)
>>> print(p.x, p.y)
1 2
>>> p.x += 2; p.y += 3; print(p)
Point(x=3, y=5)

より完全な の例です。 があります (これにはパフォーマンスの比較も含まれています)。

Recordclass ライブラリは、現在、別のバリエーションである -- recordclass.make_dataclass ファクトリ関数を提供します。

recordclassmake_dataclass はクラスを生成することができ、そのインスタンスのメモリ占有量は __slots__ -ベースのインスタンスよりも少ないメモリを消費します。これは、参照サイクルを持つことを意図していない属性値を持つインスタンスにとって重要である。何百万ものインスタンスを作成する必要がある場合、メモリ使用量を削減するのに役立つかもしれません。以下は、図解の の例です。 .