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




type-conversion