Automatisches festlegen einer enum-Mitglied Wert auf seinen Namen
Ich ve wurde Herumspielen mit python-enum-Bibliothek und haben sich über ein Rätsel. In den docs, Sie zeigen ein Beispiel für eine die automatische Nummerierung von enum, wobei etwas definiert ist:
class Color(AutoNumber):
red = ()
green = ()
...
Möchte ich eine ähnliche Klasse, aber der Wert würde automatisch aus dem Namen des Elements UND halten Sie die Funktionalität, die Sie tun, die str
und enum
mixin Zeug
So etwas wie:
class Animal(MagicStrEnum):
horse = ()
dog = ()
Animal.dog == 'dog' # True
Ist, habe ich mich an den Quellcode des enum-Modul und versucht, eine Menge von Variationen Herumspielen mit __new__
und die EnumMeta
Klasse
- meinst du
Animal.dog.value == 'dog'
? - Verwandte: acooke.org/cute/Pythonssad0.html
- Ich denke, es könnte getan werden, indem geändert wird, EnumMeta._create_() in enum.py (hg.python.org/cpython/file/3.4/Lib/enum.py#l295, jedoch nicht sofort überschrieben aufgrund ValueError auf sundered Namen aus _is_sunder() um den code. Allerdings, wenn Namen = ['rot','grün','blau'] ein und Farbe = Enum('Color', names=zip(Namen,Namen)), dann Farbe.rot.Wert == 'rot', Farbe.grün.Wert == 'grün' und Farbe.blau.Wert == 'blau'.
- Was versuchst du hier zu tun?
InformationsquelleAutor Keelan Armstrong | 2015-08-25
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Update: 2017-03-01
Ursprüngliche Antwort
Die Schwierigkeit, mit einem
AutoStr
Klasse ist, dass der name des enum-Mitglied ist nicht bestanden in den code, der es schafft, so ist es für die Verwendung nicht verfügbar. Andere Falten ist, dassstr
unveränderlich ist, so können wir nicht ändern, diese Typen von Enumerationen, die, nachdem Sie erstellt wurden (mit einem Klasse decorator, zum Beispiel).Ist die einfachste Sache zu tun ist, verwenden Sie die Funktionale API:
gibt uns:
Ist die nächste einfachste Sache zu tun, vorausgesetzt, Sie wollen eine Basis-Klasse für Ihre Zukunft enumeration verwenden, wäre so etwas wie meine
DocEnem
:und im Einsatz:
Beachten Sie, dass im Gegensatz zu der ersten option
DocEnum
Mitglieder sind nichtstr
s.Wenn Sie es tun möchten die harte Weise: Unterklasse
EnumMeta
Geige und mit der neuenEnum
's Klasse Wörterbuch vor der Mitglieder erstellt werden:Gibt uns:
1 Offenlegung: ich bin der Autor des Python stdlib
Enum
, dieenum34
backport, und die Erweiterte Aufzählung (aenum
) Bibliothek.Enum
,DocEnum
scheint nicht haben eine__hash__
Methode. Ich habe manuell kopierenEnum.__hash__
zu machenDocEnum
hashable. Warum ist das so?__eq__
definiert ist, dann__hash__
eingestellt istNone
es sei denn__hash__
definiert ist (oder etwas anderes) in der Klasse. Antwort aktualisiert.Vielleicht sind Sie auf der Suche für die
name
Attribut, welches automatisch durch dieEnum
KlasseObwohl, wenn Sie wirklich wollen, um zu Schießen selbst in den Fuß. Und ich bin sicher, dass dies vorstellen, eine ganze Welt von fallen (habe ich beseitigt, das offensichtlichste).
_EnumDict
macht es unmöglich, die add-Methoden, wie Sie auch umgewandelt werden, umstr
s.