En utilisant la classe Python Enum, existe-t-il un moyen de vérifier si un Enum contient une valeur int spécifique sans utiliser try/catch?
Avec la classe suivante:
from enum import Enum
class Fruit(Enum):
Apple = 4
Orange = 5
Pear = 6
Comment puis-je tester la valeur 6 (renvoyant true) ou la valeur 7 (renvoyant false)?
notez qu'un Enum
a un membre appelé _value2member_map_
(qui est sans papiers ...):
print(Fruit._value2member_map_)
# {4: <Fruit.Apple: 4>, 5: <Fruit.Orange: 5>, 6: <Fruit.Pear: 6>}
vous pouvez tester si une valeur est dans votre Enum
par rapport à cette carte:
5 in Fruit._value2member_map_ # True
7 in Fruit._value2member_map_ # False
si vous ne voulez pas utiliser cette fonctionnalité, c'est une alternative:
values = [item.value for item in Fruit] # [4, 5, 6]
ou (probablement mieux): utilisez un set
; l'opérateur in
sera plus efficace:
values = set(item.value for item in Fruit) # {4, 5, 6}
puis testez avec
5 in values # True
7 in values # False
has_value
à votre classevous pouvez ensuite ajouter ceci comme méthode à votre classe:
class Fruit(Enum):
Apple = 4
Orange = 5
Pear = 6
@classmethod
def has_value(cls, value):
return value in cls._value2member_map_
print(Fruit.has_value(5)) # True
print(Fruit.has_value(7)) # False
si vous voulez tester les noms (et non les valeurs), je voudrais utiliser _member_names_
:
'Apple' in Fruit._member_names_ # True
'Mango' in Fruit._member_names_ # False
Vous pouvez utiliser Enum.__members__
- un dictionnaire ordonné mappant les noms des membres :
In [12]: 'Apple' in Fruit.__members__
Out[12]: True
In [13]: 'Grape' in Fruit.__members__
Out[13]: False
S'appuyant sur ce que Reda Maachi a commencé:
6 in Fruit.__members__.values()
renvoie True
7 in Fruit.__members__.values()
renvoie False
Il suffit de vérifier si c'est dans Enum. _value2member_map_
In[15]: Fruit._value2member_map_
Out[15]: {4: <Fruit.Apple: 4>, 5: <Fruit.Orange: 5>, 6: <Fruit.Pear: 6>}
In[16]: 6 in Fruit._value2member_map_
Out[16]: True
In[17]: 7 in Fruit._value2member_map_
Out[17]: False