Comment puis-je extraire un sous-ensemble d'énumération python sans le redéfinir?
@unique
class MyTrySubset(Enum):
pass
for item in MyEnum:
setattr(MyTrySubset, item.name, item.value)
Je voudrais obtenir un équivalent à MyDesiredSubset sans avoir à le redéfinir.
@unique
class MyDesiredSubset(Enum):
THREE = 3
FOUR = 4
Jusqu'à présent, j'ai essayé quelque chose comme ça, mais MyTrySubset est cassé et le code est moche.
from enum import unique, Enum
@unique
class MyEnum(Enum):
ONE = 1
TWO = 2
THREE = 3
FOUR = 4
Des suggestions pour obtenir MyDesiredSubset sans le redéfinir?
3 Réponses :
Votre code ne fonctionnera pas - les énumérations ne sont pas tout à fait des classes:
@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
MyOther = Enum("MyOther", [(a.name,a.value) for a in MyEnum
if a in [MyEnum.THREE,MyEnum.FOUR]] )
Utilisez l'autre énumération pour déclarer celle-ci (ne sera pas comparable cependant):
@unique
class MyDesiredSubset(Enum):
THREE = MyEnum.THREE
FOUR = MyEnum.FOUR
ou utilisez l'approche fluide:
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
Si vous utilisez IntEnum à la place, vous pouvez même les comparer:
@unique
class MyEnum(Enum):
ONE = 1
TWO = 2
THREE = 3
FOUR = 4
@unique
class MyTrySubset(Enum):
pass
Je suppose qu'il convient de noter que print (MyDesiredIntSubset.THREE == 3) # True .
Cette réponse bien plus que ce que je recherchais, mais l'approche fluide fonctionne très bien.
La réponse de Patrick Artner contient ce que je cherchais en boucle dans une énumération avec une instruction if conservant les éléments souhaités.
Je viens d'extraire les bits pertinents.
class MySubset(Enum):
THREE = 3
FOUR = 4
Semble être équivalent à (sans le décorateur unique):
MySubset = Enum("MySubet", [(a.name, a.value) for a in MyEnum if a.value > 2 ] )
Je suggérerais de définir les propriétés comme indiqué dans cette question :
MyEnum.my_desired_subset
Et maintenant vous pouvez faire:
from enum import unique, Enum
@unique
class MyEnum(Enum):
ONE = 1
TWO = 2
THREE = 3
FOUR = 4
@property
def my_desired_subset(self):
return self.THREE, self.FOUR
@property
def is_desired_subset(self):
return self in self.my_desired_subset