Convert string to Enum in 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 dont 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)
Convert string to Enum in Python
def custom_enum(typename, items_dict):
class_definition =
from enum import Enum
class {}(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 result
MyEnum = 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 = 123
print(MyEnum(aaa), MyEnum(123))
Or:
class BuildType(Enum):
debug = 200
release = 400
print(BuildType.__dict__[debug])
print(eval(BuildType.debug))
print(type(eval(BuildType.debug)))
print(eval(BuildType.__name__ + .debug)) # for work with code refactoring