Using the Python Enum class, is there a way to test if an Enum contains a specific int value without using try/catch?
With the following class:
from enum import Enum class Fruit(Enum): Apple = 4 Orange = 5 Pear = 6
How can I test for the value 6 (returning true), or the value 7 (returning false)?
Enum is a class in python for creating enumerations, which are a set of symbolic names (members) bound to unique, constant values. The members of an enumeration can be compared by these symbolic anmes, and the enumeration itself can be iterated over. An enum has the following characteristics.
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
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
has_value
to your classyou 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
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
You could use Enum.__members__
- an ordered dictionary mapping names to members:
In [12]: 'Apple' in Fruit.__members__ Out[12]: True In [13]: 'Grape' in Fruit.__members__ Out[13]: False
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With