Как проверить, существует ли значение 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
Ответ 2
Вы можете использовать Enum.__members__
- упорядоченный словарь, отображающий имена участников:
In [12]: 'Apple' in Fruit.__members__
Out[12]: True
In [13]: 'Grape' in Fruit.__members__
Out[13]: 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)