Python枚举组合



我想基于两个现有的类别创建一个新的Enum(Intenum)类。有一个工作解决方案,例如:

from enum import unique, IntEnum
from itertools import chain
from collections import OrderedDict
@unique
class FirstEnumClass(IntEnum):
    a = 1
    b = 2
@unique
class SecondEnumClass(IntEnum):
    c = 3
    d = 4
# here a combined class is created:
CombinedEnumClass = unique(IntEnum('CombinedEnumClass', OrderedDict([(i.name, i.value) for i in chain(FirstEnumClass, SecondEnumClass)])))

我的问题:是否有一种奇特的方法来实现这一目标,以便有适当的班级定义?像覆盖了一些元方法,或者是这样?我想要这样的东西,因此也可以给予Docstring:

@unique
class CombinedEnumClass(IntEnum):
    """ docstring """
    # magic needed here

有什么想法吗?谢谢!

python 2

使用vars()的技巧可以完成:

class CombinedEnum(IntEnum):
    """ doc string """
    cls = vars()
    for member in chain(list(FirstEnumClass), list(SecondEnumClass)):
        cls[member.name] = member.value
    del member, cls
print(list(CombinedEnum))

这是因为:

  • vars()返回电流名称空间
  • 修改该名称空间修改类

我们删除membercls,因为我们不希望它们成为成员。


Python 3

上述(尚未)与Python3 3.4和3.5中的新Enum(不确定3.6)一起使用。一轮工作是使用aenum,这使我们能够告诉Enum忽略某些名称:

from aenum import IntEnum
class CombinedEnum(IntEnum):
    """ doc string """
    _ignore_ = 'member cls'
    cls = vars()
    for member in chain(list(FirstEnumClass), list(SecondEnumClass)):
        cls[member.name] = member.value

1 披露:我是Python STDLIB Enumenum34 Backport和Advanced Eneumeration(aenum)库的作者。

库明确防止这样做:

仅在枚举没有的情况下允许枚举 定义任何成员。

允许定义成员的枚举子类 违反了一些重要类型和实例的不变性。在 另一方面,允许分享一些共同行为是有意义的 在一组枚举之间。

因此,我使用与您几乎相同的解决方法找到了一个堆叠的答案。我认为这是唯一的方法。

最新更新