3

如何定义以某种方式派生自int、具有自定义起始值并添加自定义属性的 Python 枚举类?我知道如何从int使用enum.IntEnum和设置起始值中得出,

Goo = enum.IntEnum("Goo", "MOO FOO LOO", start = 42)

以及如何将自定义属性添加到基本枚举类型,

class Goo(enum.Enum):
    MOO = (42, "forty-two")
    FOO = (43, "forty-three")
    LOO = (44, "forty-four")

    def __init__(self, value, alias):
        self._value = value   #self.value gives AttributeError, as expected, grrr...
        self.alias = alias

但我怎么做这三个?__new__()我也试过各种方法

class Goo(int, enum.Enum):
    MOO = (42, "forty-two")
    FOO = (43, "forty-three")
    LOO = (44, "forty-four")

    def __new__(cls, value, alias):
        self = super().__new__(cls, value)
        self.alias = alias

        return self

大多是奇怪的错误,

TypeError: int() takes at most 2 arguments (3 given)

在这种情况下。谢谢。

吉姆

4

1 回答 1

2

您想要的行为在 stdlib 中尚不可用Enum。您可以itertools.count()用来获取数字:

from enum import IntEnum
from itertools import count

_goo_count = count(42)
class Goo(IntEnum):
    #
    MOO = "forty-two"
    FOO = "forty-three"
    LOO = "forty-four"
    #
    def __new__(cls, alias):
        value = next(_goo_count)
        member = int.__new__(cls, value)
        member._value_ = value
        member.alias = alias
        return member

或者您可以使用aenum

from aenum import IntEnum

class Goo(IntEnum):
    _start_ = 42
    _init_ = 'alias'
    #
    MOO = "forty-two"
    FOO = "forty-three"
    LOO = "forty-four"

无论哪种方式,在使用中它看起来像:

>>> Goo.MOO
<Goo.MOO: 42>

>>> Goo.MOO.alias
'forty-two'

>>> Goo.MOO == 42
True

几个风格说明:

  • 你不需要括号来定义一个元组

    • 除了一个空元组
    • 或某个地方(如函数调用),该命令将被解释为不是元组
  • 留白很好;-)


披露:我是Python stdlibEnumenum34backportAdvanced Enumeration ( aenum) 库的作者。

于 2020-09-24T06:33:45.750 回答