Python中的自定义枚举创建

2024-05-28 11:16:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我可以很容易地创建一个类

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

然后我可以通过枚举值分配变量:

a = MyEnum('bob')

但是——我希望通过可能是正确值的事物来分配变量。一、 e,我想去

^{pr2}$

并让它们都工作,并且都映射到相同的枚举值。在

有没有一种不需要工厂化方法就可以做到这一点?我目前已经定义了一个create方法,因此a = MyEnum.create('Bob')可以工作,但我希望事情是无缝的。在


Tags: 方法createetcenumclass事物bobralph
2条回答

你要找的东西叫做_missing_,从Python3.6开始在stdlib中可用,从2.0开始在aenum1中都可以找到。在

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

如果_missing_未能返回MyEnum成员,则EnumMeta将引发异常(因此_missing_不必担心该部分)2。在


1公开:我是Python stdlib ^{}^{} backport和{a3}库的作者。在

感谢Aran Fey提起这个问题。在

这可以通过子类化^{}来实现,后者是负责定义MyEnum('Bob')调用的^{}方法的metaclass。在

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"

(请记住,所有枚举值都必须小写;即BOB = 'Bob'将不起作用。)

演示:

^{pr2}$

相关问题 更多 >