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

Leave a Reply

Your email address will not be published. Required fields are marked *