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