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不重新定义的情况下获得?
您的代码将无法工作 - 枚举不完全是类:
Run Code Online (Sandbox Code Playgroud)@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
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)
| 归档时间: |
|
| 查看次数: |
1063 次 |
| 最近记录: |