Введите подсказки в 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
Другие вопросы по тегам