Me pregunto cuál es la forma correcta de convertir (deserializar) una cadena a una clase Enum de Python. Parece que getattr(YourEnumType, str)
hace el trabajo, pero no estoy seguro de si es lo suficientemente seguro.
Solo para ser más específico, me gustaría convertir una 'debug'
cadena en un objeto Enum como este:
class BuildType(Enum):
debug = 200
release = 400
python
string
serialization
enums
type-conversion
Vladius
fuente
fuente
Build.get('illegal', Build.debug)
?Enum
no viene con un.get()
método, pero puede agregar uno según sea necesario, o simplemente hacer unaEnum
clase base y siempre heredar de eso.Build('debug')
Build('debug')
. El constructor de la clase debe tomar el valor , es decir,200
o400
en este ejemplo. Para pasar el nombre debe usar corchetes, como ya dice la respuesta.Otra alternativa (especialmente útil si sus cadenas no se asignan 1-1 a sus casos de enumeración) es agregar un
staticmethod
a suEnum
, por ejemplo:Entonces puedes hacer
question_type = QuestionType.from_str('singleSelect')
fuente
¿O necesita convertir una cadena a Enum conocida ?
O:
fuente
debug
cadena en una enumeración de tales:python class BuildType(Enum): debug = 200 release = 400
__dict__
lo mismo quegetattr
? Me preocupan las colisiones de nombres con atributos internos de Python ...getattr
. No veo ninguna razón para las colisiones de nombres. Simplemente no puede establecer la palabra clave como campo de clase.Mi solución al problema similar a Java. Espero que ayude a alguien ...
fuente
Una mejora a la respuesta de @rogueleaderr:
fuente
Solo quiero notificar que esto no funciona en Python 3.6
Tendrás que dar los datos como una tupla como esta
EDITAR: Esto resulta ser falso. Créditos a un comentarista por señalar mi error
fuente
,
(coma) después de cada elemento (como si los elementos fueran una lista), entonces trata a cada elemento como una tupla. (a = 'aaa',
es decir, en realidad es lo mismo quea = ('aaa',)
),
detrás de cada línea al definir la enumeración que de alguna manera convirtió los valores en tuplas