向 Python enum.IntEnum 添加属性和起始值

Jim*_*Jim 5 python enums

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

Goo = enum.IntEnum("Goo", "MOO FOO LOO", start = 42)
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

但我该如何做到这三个呢?__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
Run Code Online (Sandbox Code Playgroud)

大多有奇怪的错误,

TypeError: int() takes at most 2 arguments (3 given)
Run Code Online (Sandbox Code Playgroud)

在这种情况下。谢谢。

吉姆

Eth*_*man 5

您想要的行为在 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
Run Code Online (Sandbox Code Playgroud)

或者你可以使用aenum

from aenum import IntEnum

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

不管怎样,在使用中它看起来像:

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

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

>>> Goo.MOO == 42
True
Run Code Online (Sandbox Code Playgroud)

一些风格注释:

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

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


声明:我是Python stdlibEnumenum34backportAdvanced Enumeration ( aenum)库的作者 。