test for values
variant 1
note that an Enum
has a member called _value2member_map_
(which is undocumented and may be changed/removed in future python versions):
print(Fruit._value2member_map_)
# {4: <Fruit.Apple: 4>, 5: <Fruit.Orange: 5>, 6: <Fruit.Pear: 6>}
you can test if a value is in your Enum
against this map:
5 in Fruit._value2member_map_ # True
7 in Fruit._value2member_map_ # False
variant 2
if you do not want to rely on this feature this is an alternative:
values = [item.value for item in Fruit] # [4, 5, 6]
or (probably better): use a set
; the in
operator will be more efficient:
values = set(item.value for item in Fruit) # {4, 5, 6}
then test with
5 in values # True
7 in values # False
add has_value
to your class
you could then add this as a method to your class:
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
starting form python 3.9 (?) python offers IntEnum
. with these you could do this:
from enum import IntEnum
class Fruit(IntEnum):
Apple = 4
Orange = 5
Pear = 6
print(6 in iter(Fruit)) # True
note there is no need to create a list
; just iterating over iter(Fruit)
will do. again, if this is needed repeatedly it may be worth creating a set as above:
values = set(Fruit)
print(5 in values) # True
test for keys
if you want to test for the names (and not the values) i would use _member_names_
:
'Apple' in Fruit._member_names_ # True
'Mango' in Fruit._member_names_ # False
try/except
in Python is absolutely okay (although I admit that I had a hard time to get it). So, what is the reason for you not to use it? – Eclipse