Как извлечь подмножество перечисления python, не переопределяя его? - PullRequest
0 голосов
/ 16 января 2019

Как извлечь подмножество перечисления python, не переопределяя его?

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

I хотел бы, чтобы получил эквивалент 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, не переопределяя его?

Ответы [ 2 ]

0 голосов
/ 19 января 2019

Ответ Патрика Артнера содержит то, что я искал, просматривая перечисление с оператором if, сохраняющим нужные элементы.

Только что извлекли соответствующие биты.

MySubset = Enum("MySubet", [(a.name, a.value) for a in MyEnum if a.value > 2 ] )

Кажется эквивалентным (без уникального декоратора):

class MySubset(Enum):
    THREE = 3
    FOUR = 4
0 голосов
/ 16 января 2019

Ваш код не будет работать - перечисления не совсем классы:

@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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...