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

Ces*_*esc 8 python enums python-3.x

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

from enum import unique, Enum
@unique
class MyEnum(Enum):
    ONE = 1
    TWO = 2
    THREE = 3
    FOUR = 4
Run Code Online (Sandbox Code Playgroud)

获得相当于MyDesiredSubset而不必再次定义它。

@unique
class MyDesiredSubset(Enum):
    THREE = 3
    FOUR = 4
Run Code Online (Sandbox Code Playgroud)

到目前为止,我尝试过这样的事情,但MyTrySubset被破坏了,代码也很丑陋。

@unique
class MyTrySubset(Enum):
    pass

for item in MyEnum:
    setattr(MyTrySubset, item.name, item.value)
Run Code Online (Sandbox Code Playgroud)

任何建议如何在MyDesiredSubset不重新定义的情况下获得?

Pat*_*ner 5

您的代码将无法工作 - 枚举不完全是类:

@unique
class MyEnum(Enum):
    ONE = 1
    TWO = 2
    THREE = 3
    FOUR = 4

@unique
class MyTrySubset(Enum):
    pass
Run Code Online (Sandbox Code Playgroud)
 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
Run Code Online (Sandbox Code Playgroud)

使用另一个枚举来声明这个枚举(但不会比较相等):

@unique
class MyDesiredSubset(Enum):
    THREE = MyEnum.THREE
    FOUR = MyEnum.FOUR
Run Code Online (Sandbox Code Playgroud)

或使用流畅的方法:

MyOther = Enum("MyOther", [(a.name,a.value) for a in MyEnum 
                           if a in [MyEnum.THREE,MyEnum.FOUR]] )
Run Code Online (Sandbox Code Playgroud)

如果你使用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
Run Code Online (Sandbox Code Playgroud)