Введіть підказки в nametuple


127

Розглянемо наступний фрагмент коду:

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

Кодекс вище - це лише спосіб продемонструвати те, що я намагаюся досягти. Я хотів би зробити namedtupleпідказки типу.

Чи знаєте ви який-небудь елегантний спосіб досягти результату за задумом?


2
Також, починаючи з py3.7, у вас є параметр dataclass: docs.python.org/3/library/dataclasses.html
JohnE

Відповіді:


151

Кращий синтаксис для введеного імені кортежу з 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, подумайте про використання dataclasses(ваш IDE ще не підтримує їх для перевірки статичного типу):

from dataclasses import dataclass

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

Point(3)  # -> Point(x=3, y=1)

12
@JohnE; ОП спеціально попросила назвати кортежі. Так, багато випадків використання названих кортежів будуть краще обслуговуватися класами даних. Але, щоб процитувати відмінне Чому б не назвали парни : Якщо ви хочете кортеж з іменами, неодмінно: перейдіть на названий пар
Вольфганг Куен

1
Використовуючи класи класів даних, неможливо деконструювати отриманий об’єкт, як ви могли би
Tuple

6
Кортеж незмінний. Клас даних не є (за замовчуванням), він має заморожений прапор, який наближається до поведінки кортежу. Просто щось слід пам’ятати.
shao.lo

103

Можна використовувати typing.NamedTuple

Від док

Введена версію про namedtuple.

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

Це є лише в Python 3.5


Я оголосив це так: GeoPoint = NamedTuple('GeoPoint', [('longitude', float), ('latitude', float)])я намагаюся гео = GeoPoint (** дані) , де дані не диктує , що містить необхідні ключі і цінності , які decimal.Decimalі не лита , щоб поплавець не відбувається, (НЕ typerror або :( :( так , як це typing.NamedTupleпрацює см? Суть .github.com / andilabs / 15002176b2bda786b9037077fa06cc71
andilabs

8
Введення @andi не застосовує та не додає змінні, afaik.
Bhargav Rao
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.