Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I test if int value exists in Python Enum without using try/catch?

Tags:

python

enums

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)?

like image 516
Nathan Kovner Avatar asked Apr 26 '17 12:04

Nathan Kovner


People also ask

Is enum Pythonic?

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.


2 Answers

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 

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 
like image 106
hiro protagonist Avatar answered Sep 19 '22 16:09

hiro protagonist


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 
like image 23
Reda Maachi Avatar answered Sep 21 '22 16:09

Reda Maachi