Python中的自定义枚举创建
我可以很容易地创建一个类,比如Python中的自定义枚举创建,python,enums,Python,Enums,我可以很容易地创建一个类,比如 class MyEnum(enum.Enum): BOB = "bob" RALPH = "ralph" ETC = "etc" 然后我可以通过枚举值分配变量: a=MyEnum('bob') 然而——我想通过可能是正确值的东西来分配变量。也就是说,我想 a = MyEnum('bob') b = MyEnum('Bob') c = MyEnum('BOB') 让它们都工作,并且都映射到相同的枚举值 有没有一种不用工厂方法就能做到这一点的方法?我目
class MyEnum(enum.Enum):
BOB = "bob"
RALPH = "ralph"
ETC = "etc"
然后我可以通过枚举值分配变量:
a=MyEnum('bob')
然而——我想通过可能是正确值的东西来分配变量。也就是说,我想
a = MyEnum('bob')
b = MyEnum('Bob')
c = MyEnum('BOB')
让它们都工作,并且都映射到相同的枚举值
有没有一种不用工厂方法就能做到这一点的方法?我目前已经定义了一个
create
方法,因此a=MyEnum.create('Bob')
可以工作,但我希望事情是无缝的。这可以通过子类化来实现,子类化负责定义由MyEnum('Bob')
调用的方法
(请记住,所有枚举值都必须是小写的;即,BOB='BOB'
不起作用。)
演示:
>>> MyEnum('Bob')
<MyEnum.BOB: 'bob'>
>>> MyEnum('Bob') is MyEnum.BOB
True
MyEnum('Bob')
>>>MyEnum(“Bob”)是MyEnum.Bob
真的
您正在寻找的东西被称为
\u missing\u
,从Python3.6开始在stdlib中可用,从2.0开始在aenum
1中可用
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
如果\u missing\u
未能返回MyEnum
成员,则EnumMeta
将引发异常(因此\u missing\u
不必担心该部分)
1披露:我是,和图书馆的作者
2谢谢Aran Fey提出这个问题。子类化
EnumMeta
是危险的——请参见。您可能应该在\u missing\u
中提出ValueError
,否则类似于MyEnum('a')的问题
只需返回None
@Aran Fey:EnumMeta
检查该值——如果返回值不是枚举的实例(MyEnum
,在本例中),则会自动引发异常ValueError
IIRC)。调用MyEnum('a')
时不会引发异常。(Python3.7和stdlibenum.enum
)@aranfey:Huh。它在aenum
中正常工作。您想在bugs.python.org上提交错误报告吗?
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