如何在不重新定义的情况下提取python枚举子集?
from enum import unique, Enum
@unique
class MyEnum(Enum):
ONE = 1
TWO = 2
THREE = 3
FOUR = 4
我希望获得与MyDesiredSubset
的等价物,而不必再次定义它。
@unique
class MyDesiredSubset(Enum):
THREE = 3
FOUR = 4
到目前为止,我尝试过类似的操作,但是MyTrySubset
坏了,代码很丑。
@unique
class MyTrySubset(Enum):
pass
for item in MyEnum:
setattr(MyTrySubset, item.name, item.value)
有人建议如何在不重新定义的情况下获得MyDesiredSubset
吗?
答案 0 :(得分:2)
您的代码将不起作用-枚举不是完全类:
@unique class MyEnum(Enum): ONE = 1 TWO = 2 THREE = 3 FOUR = 4 @unique class MyTrySubset(Enum): pass
for item in MyEnum:
setattr(MyTrySubset, item.name, item.value) # no duplication error by @unique
setattr(MyTrySubset, item.name+"a", item.value) # no duplication error by @unique
for s in MyTrySubset:
print(s) # no output - at all
for s in MyEnum:
print(s) # prints all repr() of all Enum-values defined
使用另一个枚举来声明该枚举(尽管不会比较相等):
@unique
class MyDesiredSubset(Enum):
THREE = MyEnum.THREE
FOUR = MyEnum.FOUR
或使用流利的方法:
MyOther = Enum("MyOther", [(a.name,a.value) for a in MyEnum
if a in [MyEnum.THREE,MyEnum.FOUR]] )
如果您改用IntEnum
,甚至可以进行比较:
@unique
class MyIntEnum(IntEnum):
ONE = 1
TWO = 2
THREE = 3
FOUR = 4
@unique
class MyDesiredIntSubset(IntEnum):
THREE = MyIntEnum.THREE
FOUR = MyIntEnum.FOUR
print(MyDesiredSubset.THREE == MyEnum.THREE) # False
print(MyDesiredIntSubset.THREE == MyIntEnum.THREE) # True
print(MyDesiredIntSubset.THREE == 3) # True @Steven Rumbalski
答案 1 :(得分:2)
答案 2 :(得分:0)
帕特里克·阿特纳(Patrick Artner)的答案包含了我一直在寻找的一个带有if语句并保留所需元素的枚举。
只需提取相关位。
MySubset = Enum("MySubet", [(a.name, a.value) for a in MyEnum if a.value > 2 ] )
似乎等同于(没有唯一的装饰器):
class MySubset(Enum):
THREE = 3
FOUR = 4