将成员添加到 Python 枚举

Adding members to Python Enums

我知道这 不是 标准用例,但我需要将元素动态添加到 IntEnum 派生的 class in [=18] =].请注意,使用函数 API 动态创建 Enum 是不够的。我需要将元素添加到现有枚举中。我该怎么做?

背景:对于那些想知道为什么有人想要这样做的人。我正在包装一个库,枚举的值是在库中定义的。我可以使用库 API 查询名称和值。但是我无法在初始化时执行此操作,因为它取决于库根据用户请求动态加载的组件。我可以在启动时加载所有组件并使用功能 API 在导入时创建枚举,但这很耗时并且有副作用。

枚举是不可变的,这才是重点。您可以创建一个新的枚举来代替原来的枚举:

from enum import Enum

names = [m.name for m in ExistingEnum] + ['newname1', 'newname2']
ExistingEnum = Enum('ExistingEnum', names)

但任何现有引用(例如,在其他模块中)将继续使用旧定义。

names 可以是:

  • 包含成员名称的字符串,以空格或逗号分隔。值从 start 递增 1(可以设置为关键字参数,默认为 1)。
  • 可迭代的成员名称(如上面的代码所示)。值从 start.
  • 递增 1
  • 可迭代的(成员名称、值)对。
  • 成员名称 -> 值对的映射。

这是 aenum library1.

extend_enum 函数的作业

一对样本Enums:

from aenum import Enum

class Color(Enum):
    black = 0

class ColorHelp(Enum):
    _init_ = 'value __doc__'
    black = 0, 'the absence of color'

extend_enum 在行动:

from aenum import extend_enum

extend_enum(Color, 'white', 1)
print Color, list(Color)
print repr(Color.black), Color.black, repr(Color.white), Color.white
print

extend_enum(ColorHelp, 'white', 1, 'the presence of every color')
print ColorHelp, list(ColorHelp)
print repr(ColorHelp.black), ColorHelp.black, ColorHelp.black.__doc__, repr(ColorHelp.white), ColorHelp.white, ColorHelp.white.__doc__

这给了我们:

<enum 'Color'> [<Color.black: 0>, <Color.white: 1>]
<Color.black: 0> Color.black <Color.white: 1> Color.white

<enum 'ColorHelp'> [<ColorHelp.black: 0>, <ColorHelp.white: 1>]
<ColorHelp.black: 0> ColorHelp.black the absence of color <ColorHelp.white: (1, 'the presence of every color')> ColorHelp.white None

1 披露:我是 Python stdlib Enum, the enum34 backport, and the Advanced Enumeration (aenum) 库的作者。