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和stdlib
enum.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