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.
解决方案
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.
2 Thanks, Aran-Fey, for bringing that up.