How to convert int to Enum in python? How to convert int to Enum in python? python python

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.