Введите подсказки в namedtuple
Рассмотрим следующий фрагмент кода:
from collections import namedtuple
point = namedtuple("Point", ("x:int", "y:int"))
Кодекс выше - просто способ продемонстрировать то, чего я пытаюсь достичь. Я хотел бы сделать namedtuple
с подсказками типа.
Знаете ли вы какой-нибудь элегантный способ, как добиться результата, как задумано?
3 ответа
Предпочтительный синтаксис для типизированного именованного кортежа начиная с 3.6
from typing import NamedTuple
class Point(NamedTuple):
x: int
y: int = 1 # Set default value
Point(3) # -> Point(x=3, y=1)
Отредактируйте Начиная с Python 3.7, рассмотрите возможность использования классов данных (ваша IDE может еще не поддерживать их для статической проверки типов):
from dataclasses import dataclass
@dataclass
class Point:
x: int
y: int = 1 # Set default value
Point(3) # -> Point(x=3, y=1)
Ты можешь использовать typing.NamedTuple
Из документов
Печатная версия
namedtuple
,
>>> import typing
>>> Point = typing.NamedTuple("Point", [('x', int), ('y', int)])
Это присутствует только в Python 3.5 и далее
Справедливости ради, от
typing
:
>>> from typing import NamedTuple
>>> class Point(NamedTuple):
... x: int
... y: int = 1 # Set default value
...
>>> Point(3)
Point(x=3, y=1)
равно классическому:
>>> 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
функцию из исходного кода
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