web-dev-qa-db-fra.com

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

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)?

39
Nathan Kovner

tester les valeurs

variante 1

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

variante 2

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

ajouter has_value à votre classe

vous 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

test pour les clés

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
66
hiro protagonist

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
13
Reda Maachi

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

6 in Fruit.__members__.values() 

renvoie True

7 in Fruit.__members__.values()  

renvoie False

4
manu3d

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
4
JianWei