Введите подсказки в namedtuple

Рассмотрим следующий фрагмент кода:

from collections import namedtuple
point = namedtuple("Point", ("x:int", "y:int"))

Приведенный выше код - это просто способ продемонстрировать, чего я пытаюсь достичь. Я хотел бы сделать namedtuple с подсказками типа.

Вы знаете какой-нибудь изящный способ добиться желаемого результата?


person Pavel Hanpari    schedule 14.12.2015    source источник
comment
Кроме того, начиная с py3.7 у вас есть опция dataclass: docs.python.org/3 /library/dataclasses.html   -  person JohnE    schedule 23.07.2018


Ответы (2)


Предпочтительный синтаксис для типизированного именованного кортежа с версии 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, рассмотрите возможность использования _2 _ (ваша IDE может еще не поддерживать их для проверки статического типа):

from dataclasses import dataclass

@dataclass
class Point:
    x: int
    y: int = 1  # Set default value

Point(3)  # -> Point(x=3, y=1)
person Wolfgang Kuehn    schedule 26.04.2018
comment
@JohnE; OP специально запросил именованные кортежи. Да, многие варианты использования именованных кортежей лучше обслуживаются классами данных. Но если процитировать превосходный Почему бы не использовать именованные кортежи: Если вы обязательно хотите кортеж с именами: выберите именованный кортеж - person Wolfgang Kuehn; 30.07.2018
comment
Используя классы данных, невозможно деконструировать результирующий объект, как если бы вы могли Tuple - person VARAK; 24.10.2019
comment
Кортеж неизменен. Класс данных не имеет (по умолчанию) замороженного флага, который приближается к поведению кортежа. Просто кое-что, о чем нужно знать. - person shao.lo; 03.12.2019
comment
если dataclass работает для вас, вы можете пойти дальше и использовать пакет pydantic для принудительной проверки типов во время выполнения в элегантный способ. - person izkeros; 18.02.2021

Вы можете использовать typing.NamedTuple

Из документов

Типизированная версия namedtuple.

>>> import typing
>>> Point = typing.NamedTuple("Point", [('x', int), ('y', int)])

Это присутствует только в Python 3.5 и новее.

person Bhargav Rao    schedule 14.12.2015
comment
Я объявил это так: GeoPoint = NamedTuple('GeoPoint', [('longitude', float), ('latitude', float)]), затем я пробую geo = GeoPoint (** данные), где данные - это dict, содержащие необходимые ключи и значения, равные decimal.Decimal, и никакого преобразования в float не происходит; (ошибки типа тоже нет :( :( Итак, как это typing.NamedTuple работает ? см. gist.github.com/andilabs/15002176b2bda786b9037077fa06cc71 - person andilabs; 22.05.2017
comment
Типизация @andi не приводит к принудительному применению или преобразованию переменных, afaik. - person Bhargav Rao; 22.05.2017