members__ - Converter string em Enum em Python
python enum string (4)
Gostaria de saber qual é a maneira correta de converter (desserializar) uma string em uma classe Enum do Python.
Parece que
getattr(YourEnumType, str)
faz o trabalho, mas não tenho certeza se é seguro o suficiente.
Apenas para ser mais específico, eu gostaria de converter uma string
'debug'
em um objeto Enum como este:
class BuildType(Enum):
debug = 200
release = 400
https://src-bin.com
Answer #1
Esta funcionalidade já está incorporada no Enum [1]:
>>> from enum import Enum
>>> class Build(Enum):
... debug = 200
... build = 400
...
>>> Build['debug']
<Build.debug: 200>
[1] Documentos oficiais:
Enum programmatic access
Answer #2
Eu só quero notificar isso não funciona em python 3.6
class MyEnum(Enum):
a = 'aaa'
b = 123
print(MyEnum('aaa'), MyEnum(123))
Você terá que dar os dados como uma tupla como esta
MyEnum(('aaa',))
EDIT: Isso acaba por ser falso. Créditos para um comentarista por apontar meu erro
Answer #3
Outra alternativa (especialmente útil se suas strings não mapearem 1-1 para seus casos de enum) é adicionar um
staticmethod
ao seu
Enum
, por exemplo:
class QuestionType(enum.Enum):
MULTI_SELECT = "multi"
SINGLE_SELECT = "single"
@staticmethod
def from_str(label):
if label in ('single', 'singleSelect'):
return QuestionType.SINGLE_SELECT
elif label in ('multi', 'multiSelect'):
return QuestionType.MULTI_SELECT
else:
raise NotImplementedError
Então você pode fazer
question_type = QuestionType.from_str('singleSelect')
Answer #4
Uma melhoria para a resposta do @rogueleaderr:
class QuestionType(enum.Enum):
MULTI_SELECT = "multi"
SINGLE_SELECT = "single"
@classmethod
def from_str(cls, label):
if label in ('single', 'singleSelect'):
return cls.SINGLE_SELECT
elif label in ('multi', 'multiSelect'):
return cls.MULTI_SELECT
else:
raise NotImplementedError