Digita hints in namedtuple


127

Considera la seguente parte di codice:

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

Il codice sopra è solo un modo per dimostrare ciò che sto cercando di ottenere. Vorrei creare namedtuplesuggerimenti sul tipo.

Conosci un modo elegante per ottenere il risultato come previsto?


2
Inoltre, a partire da py3.7 hai l'opzione dataclass
JohnE

Risposte:


151

La sintassi preferita per una tupla denominata tipizzata a partire dalla 3.6 è

from typing import NamedTuple

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

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

Modifica A partire da Python 3.7, considera l'utilizzo dataclasses(il tuo IDE potrebbe non supportarli ancora per il controllo del tipo statico):

from dataclasses import dataclass

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

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

12
@JohnE; L'OP ha richiesto specificamente tuple con nome. Sì, molti casi d'uso di tuple con nome saranno meglio serviti dalle classi di dati. Ma per citare l'eccellente Why not namedtuples : Se vuoi una tupla con nomi, con tutti i mezzi: scegli una namedtuple
Wolfgang Kuehn

1
Utilizzando le classi di dati, non è possibile decostruire l'oggetto risultante come si potrebbe fare con una
tupla

6
Una tupla è immutabile. Una classe dati non è (per impostazione predefinita) ma ha il flag congelato che si avvicina al comportamento della tupla. Solo qualcosa di cui essere consapevoli.
shao.lo

103

Puoi usare typing.NamedTuple

Dai documenti

Versione digitata di namedtuple.

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

Questo è presente solo in Python 3.5 in poi


L'ho dichiarato in questo modo: GeoPoint = NamedTuple('GeoPoint', [('longitude', float), ('latitude', float)])quindi provo geo = GeoPoint (** data) dove i dati sono dict contenenti chiavi e valori necessari decimal.Decimal, e non avviene alcun cast per float; (nemmeno typerror :( :( quindi come typing.NamedTuplefunziona? Vedi gist .github.com / andilabs / 15002176b2bda786b9037077fa06cc71
andilabs

8
La digitazione @andi non impone né esegue il cast di variabili, afaik.
Bhargav Rao
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.