gpt4 book ai didi

Python 枚举组合

转载 作者:太空宇宙 更新时间:2023-11-03 14:50:45 25 4
gpt4 key购买 nike

我想在两个现有类的基础上创建一个新的 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)])))

我的问题:是否有一种奇特的方法来实现这一点,以便有一个适当的类定义?比如重写一些元类方法,还是这样?我想要这样的东西,这样也可以给出文档字符串:

@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(不确定 3.6)中的新 Enum 一起使用。解决方法是使用 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 Enum 的作者, enum34 backport , 和 Advanced Enumeration (aenum)图书馆。

关于Python 枚举组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46073413/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com