【问题标题】:Custom enum creation in Python [duplicate]Python中的自定义枚举创建[重复]
【发布时间】:2018-08-28 18:09:32
【问题描述】:

我可以轻松地创建一个类

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') 可以工作,但我希望事情是无缝的。

【问题讨论】:

    标签: python enums


    【解决方案1】:

    您要查找的内容称为 _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 Enumenum34 backportAdvanced Enumeration (aenum) 库的作者。

    2感谢 Aran-Fey 提出这个问题。

    【讨论】:

    • 您可能应该在_missing_ 中提出ValueError,否则MyEnum('a') 之类的内容只需返回None
    • @Aran-Fey: EnumMeta 检查——如果返回值不是 Enum 的实例(在这种情况下为MyEnum),那么会自动引发异常... @ 987654341@IIRC)。
    • 当我调用MyEnum('a') 时不会引发异常。 (Python 3.7 和 stdlib enum.Enum
    • @Aran-Fey:嗯。它在aenum 中正常工作。您想在 bugs.python.org 提交错误报告吗?
    【解决方案2】:

    这可以通过继承EnumMeta 来实现,metaclass 负责定义由MyEnum('Bob') 调用的__call__ 方法。

    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' 不起作用。)

    演示:

    >>> MyEnum('Bob')
    <MyEnum.BOB: 'bob'>
    >>> MyEnum('Bob') is MyEnum.BOB
    True
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-07
    • 1970-01-01
    • 2016-02-14
    • 1970-01-01
    • 2020-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多