Je me demande quelle est la bonne façon de convertir (désérialiser) une chaîne en classe Enum de Python. Cela semble getattr(YourEnumType, str)
faire le travail, mais je ne suis pas sûr que ce soit suffisamment sûr.
Pour être plus précis, je voudrais convertir une 'debug'
chaîne en un objet Enum comme ceci:
class BuildType(Enum):
debug = 200
release = 400
Build.get('illegal', Build.debug)
?Enum
ne vient pas avec une.get()
méthode, mais vous pouvez en ajouter une si nécessaire, ou simplement créer uneEnum
classe de base et toujours en hériter.Build('debug')
Build('debug')
. Le constructeur de classe doit prendre la valeur , c'est200
-400
à- dire ou dans cet exemple. Pour transmettre le nom, vous devez utiliser des crochets, comme la réponse le dit déjà.Une autre alternative (particulièrement utile si vos chaînes ne mappent pas 1-1 à vos cas d'énumération) est d'ajouter un
staticmethod
à votreEnum
, par exemple:Alors tu peux faire
question_type = QuestionType.from_str('singleSelect')
la source
Ou vous devez convertir une chaîne en Enum connu ?
Ou:
la source
debug
chaîne en une énumération de ce type:python class BuildType(Enum): debug = 200 release = 400
__dict__
la même quegetattr
? Jegetattr
. Je ne vois aucune raison de conflits de noms. Vous ne pouvez tout simplement pas définir le mot clé comme champ de classe.Ma solution de type Java au problème. J'espère que cela aide quelqu'un ...
la source
Une amélioration de la réponse de @rogueleaderr:
la source
Je veux juste signaler que cela ne fonctionne pas en python 3.6
Vous devrez donner les données sous forme de tuple comme celui-ci
EDIT: Cela s'avère être faux. Crédits à un commentateur pour avoir signalé mon erreur
la source
,
(virgule) après chaque élément (comme si les éléments étaient une liste), il traite chaque élément comme un tuple. (c'est-àa = 'aaa',
- dire est en fait le même quea = ('aaa',)
),
derrière chaque ligne tout en définissant l'énumération qui transformait les valeurs en tuples en quelque sorte