How to convert int to Enum in python?
You 'call' the Enum
class:
Fruit(5)
to turn 5
into Fruit.Orange
:
>>> from enum import Enum>>> class Fruit(Enum):... Apple = 4... Orange = 5... Pear = 6... >>> Fruit(5)<Fruit.Orange: 5>
From the Programmatic access to enumeration members and their attributes section of the documentation:
Sometimes it’s useful to access members in enumerations programmatically (i.e. situations where
Color.red
won’t do because the exact color is not known at program-writing time).Enum
allows such access:
>>> Color(1)<Color.red: 1>>>> Color(3)<Color.blue: 3>
In a related note: to map a string value containing the name of an enum member, use subscription:
>>> s = 'Apple'>>> Fruit[s]<Fruit.Apple: 4>
I think it is in simple words is to convert the int
value into Enum
by calling EnumType(int_value)
, after that access the name
of the Enum
object:
my_fruit_from_int = Fruit(5) #convert to intfruit_name = my_fruit_from_int.name #get the nameprint(fruit_name) #Orange will be printed here
Or as a function:
def convert_int_to_fruit(int_value): try: my_fruit_from_int = Fruit(int_value) return my_fruit_from_int.name except: return None
I wanted something similar so that I could access either part of the value pair from a single reference. The vanilla version:
#!/usr/bin/env python3from enum import IntEnumclass EnumDemo(IntEnum): ENUM_ZERO = 0 ENUM_ONE = 1 ENUM_TWO = 2 ENUM_THREE = 3 ENUM_INVALID = 4#endclass.print('Passes')print('1) %d'%(EnumDemo['ENUM_TWO']))print('2) %s'%(EnumDemo['ENUM_TWO']))print('3) %s'%(EnumDemo.ENUM_TWO.name))print('4) %d'%(EnumDemo.ENUM_TWO))print()print('Fails')print('1) %d'%(EnumDemo.ENUM_TWOa))
The failure throws an exception as would be expected.
A more robust version:
#!/usr/bin/env python3class EnumDemo(): enumeration = ( 'ENUM_ZERO', # 0. 'ENUM_ONE', # 1. 'ENUM_TWO', # 2. 'ENUM_THREE', # 3. 'ENUM_INVALID' # 4. ) def name(self, val): try: name = self.enumeration[val] except IndexError: # Always return last tuple. name = self.enumeration[len(self.enumeration) - 1] return name def number(self, val): try: index = self.enumeration.index(val) except (TypeError, ValueError): # Always return last tuple. index = (len(self.enumeration) - 1) return index#endclass.print('Passes')print('1) %d'%(EnumDemo().number('ENUM_TWO')))print('2) %s'%(EnumDemo().number('ENUM_TWO')))print('3) %s'%(EnumDemo().name(1)))print('4) %s'%(EnumDemo().enumeration[1]))print()print('Fails')print('1) %d'%(EnumDemo().number('ENUM_THREEa')))print('2) %s'%(EnumDemo().number('ENUM_THREEa')))print('3) %s'%(EnumDemo().name(11)))print('4) %s'%(EnumDemo().enumeration[-1]))
When not used correctly this avoids creating an exception and, instead, passes back a fault indication. A more Pythonic way to do this would be to pass back "None" but my particular application uses the text directly.