Geben Sie Hinweise in namedtuple ein

127

Betrachten Sie folgenden Code:

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

Der obige Kodex ist nur ein Weg, um zu demonstrieren, was ich erreichen möchte. Ich möchte namedtuplemit Typhinweisen machen.

Kennen Sie einen eleganten Weg, um das beabsichtigte Ergebnis zu erzielen?

Pavel Hanpari
quelle
2
Ab py3.7 haben Sie außerdem die Datenklassenoption: docs.python.org/3/library/dataclasses.html
JohnE

Antworten:

149

Die bevorzugte Syntax für ein typisiertes benanntes Tupel seit 3.6 ist

from typing import NamedTuple

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

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

Bearbeiten Starten Sie Python 3.7 und erwägen Sie die Verwendung dataclasses(Ihre IDE unterstützt sie möglicherweise noch nicht für die statische Typprüfung):

from dataclasses import dataclass

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

Point(3)  # -> Point(x=3, y=1)
Wolfgang Kühn
quelle
12
@ JohnE; Das OP fragte speziell nach benannten Tupeln. Ja, viele Anwendungsfälle mit benannten Tupeln werden von Datenklassen besser bedient. Aber um das ausgezeichnete zu zitieren Warum nicht Namedtuples : Wenn Sie ein Tupel mit Namen wollen, auf jeden Fall: Gehen Sie für ein Namedtuple
Wolfgang Kuehn
Mit Datenklassen ist es nicht möglich, das resultierende Objekt wie ein
Tupel
5
Ein Tupel ist unveränderlich. Eine Datenklasse ist nicht (standardmäßig). Sie verfügt über das eingefrorene Flag, das dem Verhalten des Tupels nahe kommt. Nur etwas zu beachten.
shao.lo
103

Sie können verwenden typing.NamedTuple

Aus den Dokumenten

Typisierte Version von namedtuple.

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

Dies ist nur in Python 3.5 verfügbar

Bhargav Rao
quelle
Ich habe es so deklariert: GeoPoint = NamedTuple('GeoPoint', [('longitude', float), ('latitude', float)])Dann versuche ich geo = GeoPoint (** Daten), wobei Daten diktiert werden, die die erforderlichen Schlüssel und Werte enthalten decimal.Decimal, und keine Umwandlung in Float erfolgt (auch kein Typerror :( :( Wie typing.NamedTuplefunktioniert das? Siehe Inhalt) .github.com / andilabs / 15002176b2bda786b9037077fa06cc71
andilabs
8
@andi Typing erzwingt oder wandelt keine Variablen, afaik.
Bhargav Rao