Python-Enum-Klasse (mit String-fromstring)

8

Ich habe einen einfachen Weg gefunden, ein Enum in Python zu implementieren (hacken):

%Vor%

Ich kann das dann so nennen:

%Vor%

Sexy!

Okay, jetzt möchte ich in der Lage sein, sowohl den numerischen Wert zu erhalten, wenn eine Zeichenfolge angegeben wird, als auch eine Zeichenfolge, wenn ein numerischer Wert angegeben wird. Nehmen wir an, ich möchte, dass die Zeichenfolgen exakt mit denen der Enum-Taste übereinstimmen.

Das Beste, was ich mir vorstellen kann, ist etwa so:

%Vor%

oder etwas ähnliches (ignoriere, wie ich ungültige Fälle abfange)

Gibt es eine bessere, pythonzentrischere Art zu tun, was ich oben mache? Oder ist das Obige schon so knapp wie es geht.

Es scheint, als müsste es einen besseren Weg geben.

    
Nick 17.12.2010, 17:01
quelle

7 Antworten

10

Nun, hier haben Sie gefragt:

%Vor%

Aber ich verstehe den Sinn von Enums in Python wirklich nicht. Es hat so ein reiches Typsystem sowie Generatoren und Coroutines, um Zustände zu verwalten.

Ich weiß, dass ich seit mehr als 12 Jahren keine Enums in Python verwende, vielleicht kannst du sie auch loswerden ;-)

    
Jochen Ritzel 17.12.2010, 17:12
quelle
18

[Die Zeit vergeht ...]

Das neue Python Enum ist endlich in 3.4 gelandet und wurde ebenfalls zurückportiert . Also die Antwort auf deine Frage ist jetzt, das zu benutzen. :)

Ein Beispiel:

%Vor%     
Ethan Furman 23.10.2013 14:56
quelle
7

Verwenden Sie ein Diktat:

%Vor%

Keine Klassen notwendig. Dicts haben deine Klasse geschlagen, weil 1.) sie unglaublich effizient sind, 2.) eine Menge unglaublicher Methoden eingebaut haben und 3.) ein universelles Sprachkonstrukt sind. Sie sind auch erweiterbar:

%Vor%

Es ist nicht ratsam, die Funktionalität von C ++ (oder einer anderen Sprache) in Python zu implementieren. Wenn Sie sich selbst "ein Enum" oder etwas von dieser Art "hacken", können Sie darauf wetten, dass die Farm es nicht auf Python-Art macht.

Wenn Sie den umgekehrten Weg gehen wollen, bauen Sie ein anderes Diktat auf. (z.B. {'1':'VAL1', ...}

    
Rafe Kettler 17.12.2010 17:15
quelle
3

Siehe: Wie kann ich ein 'Enum' in Python darstellen?

Dieser ist interessant:

%Vor%

Verwenden:

%Vor%

Es ist einfach und leicht. Sind sie Nachteile dieses Ansatzes?

BEARBEITEN: AFAIK-Enums sind nicht sehr pythonisch als Konzept, weshalb sie überhaupt nicht implementiert wurden. Ich habe sie nie benutzt und kann in Python keinen Anwendungsfall für sie sehen. Enums sind in statischen typisierten Sprachen nützlich, da sie nicht dynamisch sind;)

    
Paweł Prażak 17.12.2010 19:09
quelle
3

Dies wird tun, was Sie wollen, und verallgemeinert Ihre Implementierung, indem Sie den Code des Kessels leicht reduzieren:

%Vor%     
martineau 17.12.2010 21:41
quelle
1

Sie könnten Wörterbücher verwenden:

%Vor%

Edit: THC4k Antworten ist definitiv besser. Aber lassen Sie mich als ein Beispiel für naive Umsetzung.

    
Rod 17.12.2010 17:10
quelle
0

Sie sollten Ihre Werte nicht innerhalb der Klasse fest codieren müssen - Sie sollten besser eine Enumerator Factory haben. Dazu fügen Sie nur einige von Python bereitgestellte Nicetirs hinzu, zum Beispiel überschreiben Sie die Repräsentationsmethode oder das Attribut getting:

%Vor%

Nun benutze das einfach:

%Vor%

(Übrigens reden die Leute in der Python-Entwicklerliste darüber, höchstwahrscheinlich werden wir es tun haben eine vollständigere und mit genug Features, Implementierung von diesem nativ von Python 3.3)

    
jsbueno 17.12.2010 21:24
quelle

Tags und Links