Namedtuple wie Klasse

7

Ich schreibe diese Klasse oft in meinem Python-Code, wenn ich eine schnelle Single-Use-Klasse brauche.

%Vor%

Die Grundidee ist, dass ich so etwas schnell machen kann:

%Vor%

Natürlich skaliert das nicht gut und das Hinzufügen von Methoden ist einfach verrückt, aber trotzdem habe ich genug Daten-nur-Wegwerf-Klassen, die ich immer benutze.

Das ist, was ich dachte namedtuple würde sein. Aber die Syntax des namedtuple ist groß und unhandlich.

Gibt es etwas in der Standard-Bibliothek, das ich noch nicht gefunden habe, das das genauso gut oder besser macht?

Ist das ein schlechter Stil? oder hat es einen versteckten Fehler?

aktualisieren

Zwei konkrete Beispiele, die zeigen, warum ich nicht nur ein Diktat verwende. Beide Beispiele könnten mit einem Diktat gemacht werden, aber offensichtlich nicht idiomatisch.

%Vor%     
deft_code 27.02.2011, 02:29
quelle

5 Antworten

9

Dafür gibt es ein Python-Rezept (Es aktualisiert nur das Diktat der Instanz, anstatt setattr aufzurufen) Rezept 52308

%Vor%     
TigrisC 27.02.2011, 02:51
quelle
5

Ab Python 3.3 und danach können Sie types.SimpleNamespace verwenden:

%Vor%

Der integrierte Typ entspricht ungefähr dem folgenden Code:

%Vor%

update

Ab Python 3.7 können Sie das Modul dataclass verwenden:

%Vor%

Sie können dies wie folgt verwenden:

%Vor%

Standardmäßig enthält es Gleichheitsprüfungen und einen gut aussehenden Ausdruck:

%Vor%     
Raymond Hettinger 14.02.2016 07:29
quelle
3
%Vor%

Dies ist meine Lösung für dieses Problem. Schöne Syntax, unveränderlich (zumindest ohne auf ein unangenehmes Objekt zurückzugreifen. setattr () Gymnastik), leicht und hübsch bedruckbar. Obwohl Sie damit nichts anfangen können, was Sie mit einem Diktat nicht tun können,

%Vor%

hat eine wirklich schöne Symmetrie mit

%Vor%

und insgesamt ist nur so viel sauberer als

%Vor%     
Li Haoyi 27.07.2011 00:31
quelle
1

Was Sie haben, ist ein vollkommen vernünftiger Prototyp, aber Sie haben Recht, dass es nicht skaliert.

Wenn Sie sie gerne verwenden, aber später einen besseren Code haben möchten, würde ich Folgendes vorschlagen:

  • jedes Mal, wenn Sie das tun, Unterklasse Struktur:

    class Control(Structure): pass

  • Später, wenn Sie eine "echte" Klasse haben möchten, ersetzen Sie die Oberklasse durch etwas wie strongbox.Strongbox ( Beispielverwendung ) das gleiche Konstruktor- und Attribut-Interface, aber beschränkt, welche Slots Sie ausfüllen können.

Eine Disziplin wie diese kostet Sie nur eine zusätzliche Schlange und bricht Ihren Code nicht, wenn Sie später mehr Kraft haben wollen.

    
tangentstorm 27.02.2011 03:11
quelle
1

Sie können sich die Datensätze von George Sakkis . Es hat sich für mich als "veränderbares benanntes Tupel" bewährt.

    
TimothyAWiseman 26.10.2011 08:34
quelle

Tags und Links