将成员添加到 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
函数的作业
一对样本Enum
s:
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
) 库的作者。
我知道这 不是 标准用例,但我需要将元素动态添加到 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
函数的作业
一对样本Enum
s:
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
) 库的作者。