Es gab einige Fragen zum Implementieren von Aufzählungen in Python. Die meisten Lösungen entsprechen in etwa mehr:

class Animal:
    DOG=1
    CAT=2

Andere haben kompliziertere Methoden zum Erstellen von Aufzählungen vorgeschlagen, aber letztendlich sehen diese eher wie dieses Beispiel aus, wenn alles gesagt und getan ist.

Aufgrund meiner Erfahrung in Java und C # kann ich mir alle möglichen Verwendungsmöglichkeiten für eine solche Sprache vorstellen. Es scheint jedoch nicht sehr pythonisch zu sein. Tatsächlich scheint es, dass jedes Mal, wenn jemand fragt, warum es in Python keine Aufzählungen gibt, ein leichtes Stöhnen mit vorgefertigten Antworten darüber auftritt, dass es keinen Grund gibt, die Sicherheit des Kompilierungszeittyps in einer Sprache wie Python zu erzwingen. oder wie Designs, die Aufzählungen erfordern, in Python schlecht riechen.

Meine Frage ist nicht, wie man Enums in Python implementiert, sondern wie Menschen im Allgemeinen Lösungen für Probleme finden, die sich für Pythons auf pythonische Weise eignen. Mit anderen Worten, wie würden Sie ein Problem lösen, das sich für einen Datentyp mit einem diskreten Satz möglicher Werte eignet, ohne Ihre Java / C # -Lösung nach Python zu portieren.

10
jlund3 10 Okt. 2012 im 06:07

4 Antworten

Beste Antwort

PEP 435 wurde gerade akzeptiert, wodurch das Enum-Paket zur Standardbibliothek hinzugefügt wird mit der Enum-Klasse und anderen Derivaten wie dem IntEnum. Dies bedeutet, dass ab Python 3.4 die "pythonische" Art, Enums in einem Design zu verwenden, in diesem Paket enthalten ist. Es wird ungefähr so aussehen:

>>> from enum import Enum
>>> class Color(Enum):
...    red = 1
...    green = 2
...    blue = 3

>>> print(Color.red)
Color.red

>>> print(Color.red.name)
red

>>>> for color in Color:
....     print(color)
Color.red
Color.green
Color.blue

Das Hauptmerkmal dieses Entwurfs ist, dass Schlüssel Vergleiche ablehnen können, wenn dies nicht sinnvoll ist (im Gegensatz zu den in anderen Antworten vorgeschlagenen Zeichenfolgenschlüsseln), dass Schlüssel einen hübschen Druck haben, der nicht mit dem Schlüsselwert zusammenhängt, und dass die Schlüsselwerte speziell angegeben werden Eigenschaften durch Definieren von Methoden in der Enum-Unterklasse zusätzlich zur Eigenschaft, einen expliziten und verständlichen Fehler auszulösen, falls der Benutzer versucht, einen unzulässigen Schlüssel aus der Enum-Klasse zu verwenden.

4
jlund3 10 Mai 2013 im 14:21

Ich glaube nicht an Enums in C #. Für die Zustandsmaschine haben Sie das Strategiemuster. Anstatt den Zustand eines Objekts zu betrachten und zu entscheiden, was zu tun ist. Verkapseln Sie die Logik dessen, was im Objekt selbst zu tun ist.

Dies ist ein natürlicher Ansatz in Python und die Einführung von Aufzählungen fördert für mich nur schlechten Code.

-1
Michael Brown 30 Sept. 2014 im 22:24

Da Python-Zeichenfolgen unveränderlich sind (und Python sie nach Bedarf interniert), ist die Verwendung numerischer Aufzählungen für Mengen von Dingen nicht wirklich von Vorteil. Stattdessen können Sie einfach eine frozenset oder tuple Zeichenfolge verwenden (je nachdem, ob Sie sich für eine Bestellung interessieren).

Wenn Sie sich andererseits für den Namespace interessieren, funktioniert es einwandfrei, die Attribute einer Klasse zu erstellen.

Wie in den Kommentaren erwähnt, sind erstklassige Funktionen Ihr Freund, wenn Sie nach einer Zustandsmaschinenimplementierung suchen.

3
Amber 10 Okt. 2012 im 02:28

Da ich nicht aus C # oder Java stamme, verstehe ich dieses Interesse an Aufzählungen immer noch nicht ganz.

Soweit ich weiß, würde ich wahrscheinlich auf den Django-Stil zurückgreifen, indem ich alle erforderlichen Konstanten in eine Einstellungsdatei einfüge und gegebenenfalls importiere.

Settings.py/animals.py

DOG = 1
CAT = 2

Andere Datei:

from animals import CAT, DOG

Oder auch...

Settings.py

ANIMALS = { "DOG": 1, "CAT": 2}

Andere Datei:

from settings import ANIMALS

my_animal = "FROG"
if my_animal not in ANIMALS.keys():
    print "new species discovered!"
2
monkut 10 Okt. 2012 im 02:22