Convert string to Enum in Python Convert string to Enum in Python python python

Convert string to Enum in Python


This functionality is already built in to Enum [1]:

>>> from enum import Enum>>> class Build(Enum):...   debug = 200...   build = 400... >>> Build['debug']<Build.debug: 200>

The member names are case sensitive, so if user-input is being converted you need to make sure case matches:

an_enum = input('Which type of build?')build_type = Build[an_enum.lower()]

[1] Official docs: Enum programmatic access


Another alternative (especially useful if your strings don't map 1-1 to your enum cases) is to add a staticmethod to your Enum, e.g.:

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

Then you can do question_type = QuestionType.from_str('singleSelect')


def custom_enum(typename, items_dict):    class_definition = """from enum import Enumclass {}(Enum):    {}""".format(typename, '\n    '.join(['{} = {}'.format(k, v) for k, v in items_dict.items()]))    namespace = dict(__name__='enum_%s' % typename)    exec(class_definition, namespace)    result = namespace[typename]    result._source = class_definition    return resultMyEnum = custom_enum('MyEnum', {'a': 123, 'b': 321})print(MyEnum.a, MyEnum.b)

Or do you need to convert string to known Enum?

class MyEnum(Enum):    a = 'aaa'    b = 123print(MyEnum('aaa'), MyEnum(123))

Or:

class BuildType(Enum):    debug = 200    release = 400print(BuildType.__dict__['debug'])print(eval('BuildType.debug'))print(type(eval('BuildType.debug')))    print(eval(BuildType.__name__ + '.debug'))  # for work with code refactoring