Как проверить, существует ли значение int в Python Enum без использования try/catch?

Используя класс Python Enum, существует ли способ проверить, содержит ли Enum определенное значение int без использования try/catch?

Со следующим классом:

from enum import Enum

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

Как я могу проверить значение 6 (возврат true) или значение 7 (возврат false)?

Ответ 1

проверка значений

вариант 1

обратите внимание, что у Enum есть член с именем _value2member_map_ (который недокументирован...):

print(Fruit._value2member_map_)
# {4: <Fruit.Apple: 4>, 5: <Fruit.Orange: 5>, 6: <Fruit.Pear: 6>}

вы можете проверить, есть ли значение в вашем Enum для этой карты:

5 in Fruit._value2member_map_  # True
7 in Fruit._value2member_map_  # False

вариант 2

если вы не хотите полагаться на эту функцию, это альтернатива:

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

или (возможно, лучше): используйте set; оператор in будет более эффективным:

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

затем протестируйте с помощью

5 in values  # True
7 in values  # False

добавьте has_value в свой класс

Затем вы можете добавить это в качестве метода для вашего класса:

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

проверка на ключи

если вы хотите проверить имена (а не значения), я бы использовал _member_names_:

'Apple' in Fruit._member_names_  # True
'Mango' in Fruit._member_names_  # False

Ответ 3

Просто проверьте, есть ли это в Enum. _value2member_map_ 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

Основываясь на том, что начал Реда Маати:

6 in Fruit.__members__.values() 

возвращает True

7 in Fruit.__members__.values()  

возвращает Ложь

Ответ 5

Не.

Если вы используете Enum, вы можете проверить enum с помощью

     if isinstance(key, Fruit):

Но в противном случае попробуйте.. это питонный способ проверить перечисление. В самом деле, для любого перерыва в парадигме типизации утки.

Правильный и питонный способ проверки int в IntEnum - это попробовать и поймать ValueError в случае сбоя.

Многие из предложенных выше решений активно осуждаются и будут запрещены в 3.8 ("DeprecationWarning: использование не-Enums в проверках содержимого вызовет TypeError в Python 3.8")

Если вы действительно не заинтересованы в том, чтобы ваш код был современным, тогда вы можете просто использовать

if key in Fruit:

Ответ 6

EAFP версия ответа:

try: 
    Fruit(val)
    return True
except ValueError:
    return False

Если вы хотите получить объект enum, если он является допустимым значением, и поднять ValueError, если нет, вы можете просто использовать Fruit(val)