Ich frage mich, wie man einen String richtig in eine Python-Enum-Klasse konvertiert (deserialisiert). Scheint getattr(YourEnumType, str)
den Job zu erledigen , aber ich bin mir nicht sicher, ob es sicher genug ist.
Um genauer zu sein, möchte ich einen 'debug'
String wie folgt in ein Enum-Objekt konvertieren :
class BuildType(Enum):
debug = 200
release = 400
python
string
serialization
enums
type-conversion
Vladius
quelle
quelle
Build.get('illegal', Build.debug)
?Enum
kommt nicht mit einer.get()
Methode, aber Sie können eine nach Bedarf hinzufügen oder einfach eine Basisklasse erstellenEnum
und immer davon erben.Build('debug')
Build('debug')
. Der Klassenkonstruktor muss den Wert annehmen , dh200
oder400
in diesem Beispiel. Um den Namen zu übergeben , müssen Sie eckige Klammern verwenden, wie die Antwort bereits sagt.Eine andere Alternative (besonders nützlich, wenn Ihre Zeichenfolgen Ihren Aufzählungsfällen nicht 1-1 zuordnen) besteht darin, a
staticmethod
zu Ihren hinzuzufügenEnum
, z.Dann können Sie tun
question_type = QuestionType.from_str('singleSelect')
quelle
Oder müssen Sie einen String in eine bekannte Enum konvertieren ?
Oder:
quelle
debug
String in eine Aufzählung von solchen umwandeln :python class BuildType(Enum): debug = 200 release = 400
__dict__
das gleiche wiegetattr
? Ich mache mir Sorgen um Namenskollisionen mit internen Python-Attributen ....getattr
. Ich sehe keinen Grund für Namenskollisionen. Sie können das Schlüsselwort einfach nicht als Klassenfeld festlegen.Meine Java-ähnliche Lösung für das Problem. Hoffe es hilft jemandem ...
quelle
Eine Verbesserung der Antwort von @rogueleaderr:
quelle
Ich möchte nur benachrichtigen, dass dies in Python 3.6 nicht funktioniert
Sie müssen die Daten als solches Tupel angeben
EDIT: Dies stellt sich als falsch heraus. Dank an einen Kommentator für den Hinweis auf meinen Fehler
quelle
,
(Komma) nach jedem Element setzen (als ob die Elemente eine Liste wären), wird jedes Element als Tupel behandelt. (dha = 'aaa',
ist eigentlich das gleiche wiea = ('aaa',)
),