Используя класс Python перечисления, есть ли способ проверить, если перечисление содержит конкретное значение, без использования try и Catch?
Со следующим классом:
from enum import Enum
class Fruit(Enum):
Apple = 4
Orange = 5
Pear = 6
Как я могу проверить значение 6 (возвращает true), или значение 7 (возвращая false)?
тест ## для значений
обратите внимание, что перечисление
имеет элемент под названием _value2member_map_
(который без документов и могут быть изменены/удалены в будущей версии Python):
print(Fruit._value2member_map_)
# {4: <Fruit.Apple: 4>, 5: <Fruit.Orange: 5>, 6: <Fruit.Pear: 6>}
вы можете проверить, если значение находится в ваших `перечисление на эту карту:
5 in Fruit._value2member_map_ # True
7 in Fruit._value2member_map_ # False
если вы не хотите, чтобы полагаться на эту функцию, это альтернатива:
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
затем вы можете добавить этот метод в класс:
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
Вы могли бы использовать перечисление.__члены__
- упорядоченное отображение имен словарь для участников:
In [12]: 'Apple' in Fruit.__members__
Out[12]: True
In [13]: 'Grape' in Fruit.__members__
Out[13]: False
Просто проверить, будет ли она's в перечисление. _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
Опираясь на то, что Реды Maachi начал:
6 in Fruit.__members__.values()
возвращает true
7 in Fruit.__members__.values()
возвращает false
Дон'т.
Если вы используете enum можно проверить на перечисление с
if isinstance(key, Fruit):
Но в противном случае, попробуйте.. это подходящие для Python способ проверить перечисления. Действительно, для любой перерыв в утка-типирование парадигмы.
Правильные и подходящие для Python, способ тестирования для int в IntEnum, чтобы дать ему идти и поймать ValueError, если там'ы отказа.
Многие из предложенных выше решений активно осуждается и лишается права на 3,8 (на "DeprecationWarning: использование non-перечисления в проверки герметичности поднимет ошибку TypeError в Python 3.8 и" )
Если вы действительно заинтересованы в сохранении ваш современный код, то вы можете просто использовать
if key in Fruit:
В EAFP версия ответа:
питон попробуйте: Фрукты(Вэл) возвращает true кроме ValueError: возвращает false
Если вы хотите получить объект enum, если это допустимое значение и поднять ValueError
если нет, то можно просто использовать фрукты(вал)`