Her*_*nan 11 python enums dynamic
我知道这不是标准用例,但我需要IntEnum在Python中动态地向派生类添加元素.请注意,使用功能API动态创建Enum是不够的.我需要在现有的枚举中添加元素.我怎样才能做到这一点?
背景:对于那些想知道为什么有人想要这样做的人.我正在包装一个库,并且在库中定义了枚举的值.我可以使用库API查询名称和值.但是我不能在初始化时这样做,因为它依赖于库在用户请求时动态加载的组件.我可以在启动时加载所有组件并使用功能API在导入时创建枚举,但这很耗时并且有副作用.
Eth*_*man 17
这是aenum库1的extend_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,enum34backport和Advanced Enumeration(aenum) 库的作者.
枚举是不可改变的,这是重点.您可以创建一个替换原始内容的新枚举:
from enum import Enum
names = [m.name for m in ExistingEnum] + ['newname1', 'newname2']
ExistingEnum = Enum('ExistingEnum', names)
Run Code Online (Sandbox Code Playgroud)
但任何现有的引用(例如,在其他模块中)将继续使用旧的定义.
names 可:
start(可以设置为关键字参数,默认为1).start.