将成员添加到Python枚举

Her*_*nan 11 python enums dynamic

我知道这不是标准用例,但我需要IntEnum在Python中动态地向派生类添加元素.请注意,使用功能API动态创建Enum是不够的.我需要在现有的枚举中添加元素.我怎样才能做到这一点?

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

Eth*_*man 17

这是aenum库1extend_enum功能.


几个样本Enum:

from aenum import Enum

class Color(Enum):
    black = 0

class ColorHelp(Enum):
    _init_ = 'value __doc__'
    black = 0, 'the absence of color'
Run Code Online (Sandbox Code Playgroud)

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

这给了我们:

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

1披露:我是Python stdlibEnum,enum34backportAdvanced Enumeration(aenum) 库的作者.


Mar*_*ers 9

枚举是不可改变的,这是重点.您可以创建一个替换原始内容的新枚举:

from enum import Enum

names = [m.name for m in ExistingEnum] + ['newname1', 'newname2']
ExistingEnum = Enum('ExistingEnum', names)
Run Code Online (Sandbox Code Playgroud)

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

names 可:

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

  • **不变性*不是*枚举的“重点”。**枚举的存在是为了保证有限无序集上的互斥。在运行时将其他成员附加到现有枚举中绝不会违反此保证。Python 的标准 `enum.Enum` 类型选择禁止这个有效的用例,绝不会禁止第三方替代品这样做。另见:可变 [`aenum.Enum`](https://pypi.python.org/pypi/aenum) 和 [Java `enum`](/sf/ask/911110931/ -mutability-usecases-and-possibilities) 类型。 (5认同)
  • @CecilCurry:这些库都不会改变原始枚举,它们会扩展现有枚举以创建新枚举。如果枚举在运行时是可变的,那么就会产生广泛的影响,您无法再保证处理所有可能的值(像 Rust 这样的语言甚至在运行时不可变的枚举上构建其类型安全性)。 (3认同)