Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Custom enum creation in Python [duplicate]

Tags:

python

enums

I can easily create a class like

class MyEnum(enum.Enum):
  BOB = "bob"
  RALPH = "ralph"
  ETC = "etc"

Then I can assign variables by enum value:

a = MyEnum('bob')

However -- I want to assign variables by things that could be the correct value. I.e., I'd like to do

a = MyEnum('bob')
b = MyEnum('Bob')
c = MyEnum('BOB')

and have them all work, and all map to the same enum value.

Is there a way of doing this without making a factory method? I've currently defined a create method, so a = MyEnum.create('Bob') works, but I'd like things to be seamless.

like image 978
Tim Wescott Avatar asked May 18 '26 01:05

Tim Wescott


1 Answers

The thing you are looking for is called _missing_ and is available in the stdlib as of Python3.6, and in aenum1 as of 2.0.

class MyEnum(Enum):

    BOB = "bob"
    RALPH = "ralph"
    ETC = "etc"

    @classmethod
    def _missing_(cls, value):
        for member in cls:
            if member.value == value.lower():
                return member

If _missing_ fails to return a MyEnum member then EnumMeta will raise an exception (so _missing_ doesn't have to worry about that part)2.


1 Disclosure: I am the author of the Python stdlib Enum, the enum34 backport, and the Advanced Enumeration (aenum) library.

2 Thanks, Aran-Fey, for bringing that up.

like image 107
Ethan Furman Avatar answered May 19 '26 14:05

Ethan Furman



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!