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)?Enumno viene con un.get()método, pero puede agregar uno según sea necesario, o simplemente hacer unaEnumclase base y siempre heredar de eso.Build('debug')Build('debug'). El constructor de la clase debe tomar el valor , es decir,200o400en 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
staticmethoda suEnum, por ejemplo:Entonces puedes hacer
question_type = QuestionType.from_str('singleSelect')fuente
¿O necesita convertir una cadena a Enum conocida ?
O:
fuente
debugcadena 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