Gostaria de saber qual é a maneira correta de converter (desserializar) uma string para 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, gostaria de converter uma 'debug'
string em um objeto Enum como este:
class BuildType(Enum):
debug = 200
release = 400
python
string
serialization
enums
type-conversion
Vladius
fonte
fonte
Build.get('illegal', Build.debug)
?Enum
não vem com um.get()
método, mas você pode adicionar um conforme necessário, ou apenas criar umaEnum
classe base e sempre herdar disso.Build('debug')
Build('debug')
. O construtor da classe deve receber o valor ,200
ou seja,400
neste exemplo. Para passar o nome, você deve usar colchetes, como a resposta já diz.Outra alternativa (especialmente útil se as seqüências de caracteres não mapeiam 1-1 para os casos de enumeração) é adicionar a
staticmethod
ao seuEnum
, por exemplo:Então você pode fazer
question_type = QuestionType.from_str('singleSelect')
fonte
Ou você precisa converter a string para o Enum conhecido ?
Ou:
fonte
debug
string em uma enumeração como:python class BuildType(Enum): debug = 200 release = 400
__dict__
o mesmo quegetattr
? Eu estou preocupado com colisões de nomes com atributos Python interna ....getattr
. Não vejo razão para colisões de nomes. Você simplesmente não pode definir a palavra-chave como campo de classe.Minha solução semelhante a Java para o problema. Espero que ajude alguém ...
fonte
Uma melhoria na resposta de @rogueleaderr:
fonte
Eu só quero notificar que isso não funciona no python 3.6
Você terá que fornecer os dados como uma tupla como esta
EDIT: Isso acaba sendo falso. Créditos a um comentarista por apontar meu erro
fonte
,
(vírgula) após cada elemento (como se os elementos fossem uma lista), ele tratará cada elemento como uma tupla. (isto é,a = 'aaa',
é efectivamente o mesmo quea = ('aaa',)
),
atrás de cada linha ao definir a enumeração que se transformou os valores em tuplas de alguma forma