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?


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)

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


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.