Как я могу проверить, если значение существует в Python перечисление без использования попробовать/поймать?

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

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

from enum import Enum

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

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

Решение

тест ## для значений

Вариант 1

обратите внимание, что перечисление имеет элемент под названием _value2member_map_ (который без документов и могут быть изменены/удалены в будущей версии Python):

print(Fruit._value2member_map_)
# {4: , 5: , 6: }

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

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

вариант 2

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

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

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

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
Комментарии (5)

Вы могли бы использовать перечисление.__члены__ - упорядоченное отображение имен словарь для участников:

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

In [13]: 'Grape' in Fruit.__members__
Out[13]: False
Комментарии (3)

Просто проверить, будет ли она's в перечисление. _value2member_map_

In[15]: Fruit._value2member_map_
Out[15]: {4: , 5: , 6: }

In[16]: 6 in Fruit._value2member_map_
Out[16]: True

In[17]: 7 in Fruit._value2member_map_
Out[17]: False
Комментарии (1)

Опираясь на то, что Реды Maachi начал:

6 in Fruit.__members__.values() 

возвращает true

7 in Fruit.__members__.values()  

возвращает false

Комментарии (1)

Дон'т.

Если вы используете enum можно проверить на перечисление с

     if isinstance(key, Fruit):

Но в противном случае, попробуйте.. это подходящие для Python способ проверить перечисления. Действительно, для любой перерыв в утка-типирование парадигмы.

Правильные и подходящие для Python, способ тестирования для int в IntEnum, чтобы дать ему идти и поймать ValueError, если там'ы отказа.

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

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

if key in Fruit:
Комментарии (0)

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

питон попробуйте: Фрукты(Вэл) возвращает true кроме ValueError: возвращает false

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

Комментарии (0)