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.