Wpisz podpowiedzi w namedtuple

127

Rozważ następujący fragment kodu:

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

Powyższy Kod jest tylko sposobem na zademonstrowanie tego, co próbuję osiągnąć. Chciałbym zrobić namedtupleze wskazówkami dotyczącymi typu.

Czy znasz jakiś elegancki sposób, jak osiągnąć zamierzony efekt?

Pavel Hanpari
źródło
2
Ponadto, zaczynając od py3.7, masz opcję klasy dataclass
JohnE

Odpowiedzi:

151

Preferowana składnia dla wpisanej nazwanej krotki od wersji 3.6 to

from typing import NamedTuple

class Point(NamedTuple):
    x: int
    y: int = 1  # Set default value

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

Edytuj Uruchamianie Pythona 3.7, rozważ użycie dataclasses(Twoje IDE może jeszcze nie obsługiwać ich do sprawdzania typu statycznego):

from dataclasses import dataclass

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

Point(3)  # -> Point(x=3, y=1)
Wolfgang Kuehn
źródło
12
@JohnE; OP specjalnie poprosił o nazwane krotki. Tak, wiele przypadków użycia nazwanych krotek będzie lepiej obsługiwanych przez klasy danych. Ale cytując wspaniałe Dlaczego nie nazwane dwudziestki : jeśli chcesz krotkę z imionami, jak najbardziej: idź po imienną dwuosobową
Wolfgang Kuehn
1
Korzystając z klas danych, nie można zdekonstruować powstałego obiektu, tak jak krotki
VARAK
6
Krotka jest niezmienna. Klasa danych nie jest (domyślnie). Ma flagę frozen, która zbliża się do zachowania krotki. Po prostu coś, o czym należy pamiętać.
shao.lo
103

Możesz użyć typing.NamedTuple

Z dokumentów

Wpisane wersję z namedtuple.

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

Jest to obecne tylko w Pythonie 3.5 i nowszych

Bhargav Rao
źródło
Zadeklarowałem to w ten sposób: GeoPoint = NamedTuple('GeoPoint', [('longitude', float), ('latitude', float)])następnie próbuję geo = GeoPoint (** dane), gdzie dane są dict zawierające potrzebne klucze i wartości decimal.Decimal, i nie następuje rzutowanie do float; (również nie ma błędu :( :( więc jak to typing.NamedTupledziała? Zobacz streszczenie) .github.com / andilabs / 15002176b2bda786b9037077fa06cc71
andilabs
8
Wpisywanie @andi nie wymusza ani nie rzutuje zmiennych, afaik.
Bhargav Rao