47 votes

Comment tester si la valeur int existe dans Python Enum sans utiliser try / catch?

À l'aide de 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)?

80voto

hiro protagonist Points 1983

vous pouvez lister les valeurs comme ceci:

values = [item.value for item in Fruit]  # [4, 5, 6]

ou (probablement le meilleur): utiliser un set; l' in opérateur sera plus efficace:

values = set(item.value for item in Fruit)  # {4, 5, 6}

puis test avec

5 in values  # True
7 in values  # False

vous pouvez également ajouter ce que une méthode à votre classe:

class Fruit(Enum):
    Apple = 4
    Orange = 5
    Pear = 6

    @classmethod
    def has_value(cls, value):
        return any(value == item.value for item in cls)


print(Fruit.has_value(5))  # True
print(Fruit.has_value(7))  # False

si vous voulez tester pour les noms (et pas les valeurs) , Reda Maachi la réponse de couvre ce que je ferais.

17voto

Reda Maachi Points 486

Vous pouvez utiliser Enum.__members__ - un nom de dictionnaire dictionnaire mappé aux membres :

 In [12]: 'Apple' in Fruit.__members__
Out[12]: True

In [13]: 'Grape' in Fruit.__members__
Out[13]: False
 

5voto

JianWei Points 42

Il suffit de vérifier si c'est en 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
 

5voto

manu3d Points 470

S'appuyant sur ce que Reda Maachi a commencé:

 6 in Fruit.__members__.values() 
 

renvoie True

 7 in Fruit.__members__.values()  
 

renvoie False

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X