Custom enum creation in Python
本问题已经有最佳答案,请猛点这里访问。
我可以很容易地创建一个类
1 2 3 4 | class MyEnum(enum.Enum): BOB ="bob" RALPH ="ralph" ETC ="etc" |
然后我可以通过枚举值分配变量:
但是——我想通过一些可能是正确值的东西来分配变量。也就是说,我想这样做
1 2 3 | a = MyEnum('bob') b = MyEnum('Bob') c = MyEnum('BOB') |
号
让它们都工作,并且都映射到相同的枚举值。
有没有一种方法可以在不使用工厂方法的情况下做到这一点?我目前已经定义了一个
您要查找的对象称为
1 2 3 4 5 6 7 8 9 10 11 | 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 |
如果
1公开:我是python stdlib
2谢谢你,阿兰·费伊,把这件事提出来。
这可以通过将
1 2 3 4 5 6 7 8 9 10 11 | import enum class CaseInsensitiveEnum(enum.EnumMeta): def __call__(self, string): string = string.lower() # convert the string to lowercase return super().__call__(string) class MyEnum(enum.Enum, metaclass=CaseInsensitiveEnum): BOB ="bob" RALPH ="ralph" ETC ="etc" |
(请记住,所有枚举值都必须是小写的;即,
演示:
1 2 3 4 | >>> MyEnum('Bob') <MyEnum.BOB: 'bob'> >>> MyEnum('Bob') is MyEnum.BOB True |
号