向Python枚举添加成员

2024-05-28 20:17:19 发布

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

我知道这不是标准用例,但我需要动态地向Python中的IntEnum派生类添加元素。注意,使用函数式API动态创建枚举是不够的。我需要向现有枚举添加元素。我该怎么做?

背景:对于那些想知道为什么会有人想这样做的人。我正在包装库,枚举的值在库中定义。我可以使用库API查询名称和值。但我不能在初始化时执行,因为它依赖于库根据用户请求动态加载的组件。我可以在启动时加载所有组件,并在导入时使用函数API创建枚举,但这很费时,而且会产生副作用。


Tags: 函数用户名称api元素标准定义组件
2条回答

枚举是不可变的。您可以创建一个新的枚举来替换原始枚举:

from enum import Enum

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

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

names可以是:

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

这是来自aenum library1extend_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 ^{}^{} backportAdvanced Enumeration (^{})库的作者。

相关问题 更多 >

    热门问题