次のコードを検討してください。
from collections import namedtuple
point = namedtuple("Point", ("x:int", "y:int"))
上記のコードは、私が達成しようとしていることを示すための単なる方法です。namedtuple
型ヒントで作りたいです。
意図したとおりの結果を達成するためのエレガントな方法を知っていますか?
次のコードを検討してください。
from collections import namedtuple
point = namedtuple("Point", ("x:int", "y:int"))
上記のコードは、私が達成しようとしていることを示すための単なる方法です。namedtuple
型ヒントで作りたいです。
意図したとおりの結果を達成するためのエレガントな方法を知っていますか?
使用できますtyping.NamedTuple
ドキュメントから
の型付きバージョン
namedtuple
。
>>> import typing
>>> Point = typing.NamedTuple("Point", [('x', int), ('y', int)])
これは Python 3.5 以降にのみ存在します。
公平を期すために、NamedTuple
からtyping
:
>>> from typing import NamedTuple
>>> class Point(NamedTuple):
... x: int
... y: int = 1 # Set default value
...
>>> Point(3)
Point(x=3, y=1)
クラシックに等しいnamedtuple
:
>>> from collections import namedtuple
>>> p = namedtuple('Point', 'x,y', defaults=(1, ))
>>> p.__annotations__ = {'x': int, 'y': int}
>>> p(3)
Point(x=3, y=1)
つまり、NamedTuple
単なる構文糖衣ですnamedtuple
NamedTuple
以下に、のソース コードから作成関数を見つけることができますpython 3.10
。ご覧のとおり、コンストラクターを使用し、抽出された型からcollections.namedtuple
追加します。__annotations__
def _make_nmtuple(name, types, module, defaults = ()):
fields = [n for n, t in types]
types = {n: _type_check(t, f"field {n} annotation must be a type")
for n, t in types}
nm_tpl = collections.namedtuple(name, fields,
defaults=defaults, module=module)
nm_tpl.__annotations__ = nm_tpl.__new__.__annotations__ = types
return nm_tpl