如何在不重新定义的情况下提取python枚举子集?

时间:2019-01-16 16:33:49

标签: python python-3.x enums

如何在不重新定义的情况下提取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吗?

3 个答案:

答案 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)

我建议按照this question所示定义属性:

Height

现在您可以这样做:

Width

答案 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