Cómo convertir int a Enum en python?


Usando la nueva característica Enum (vía backport enum34) con python 2.7.6.

Dada la siguiente definición, ¿cómo puedo convertir un int al valor de Enumeración correspondiente?

from enum import Enum

class Fruit(Enum):
    Apple = 4
    Orange = 5
    Pear = 6

Sé que puedo elaborar a mano una serie de declaraciones if para hacer la conversión, pero ¿hay una forma pitónica fácil de convertir? Básicamente, me gustaría una función ConvertIntToFruit (int) que devuelve un valor enum.

Mi caso de uso es que tengo un archivo csv de registros donde estoy leyendo cada registro en un objeto. Uno de los campos de archivo es un campo entero que representa una enumeración. Como estoy rellenando el objeto Me gustaría convertir ese campo entero del archivo en el valor de enumeración correspondiente en el objeto.

Author: User, 2014-05-30

2 answers

'Llama' a la clase Enum:

Fruit(5)

Para convertir 5 en Fruit.Orange:

>>> from enum import Enum
>>> class Fruit(Enum):
...     Apple = 4
...     Orange = 5
...     Pear = 6
... 
>>> Fruit(5)
<Fruit.Orange: 5>

De la sección Acceso programático a los miembros de la enumeración y sus atributos de la documentación:

A veces es útil acceder a miembros en enumeraciones programáticamente (es decir, situaciones donde Color.red no va a hacer porque el el color exacto no se conoce al momento de escribir el programa). Enum permite tal acceso:

>>> Color(1)
<Color.red: 1>
>>> Color(3)
<Color.blue: 3>
 78
Author: Martijn Pieters,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-30 10:06:12

También puede usar el diccionario python para este propósito. Según se indica,

Fruit = {4:'Apple',5:'Orange',6:'Pear'}
Fruit[4]
Fruit[6]

Salida:

Apple
Pear

O puede crear una enumeración simple de la siguiente manera,

Apple,Orange,Pear = range(4,6)
print Apple,Pear,Orange
 -4
Author: Naggappan Ramukannan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-30 11:39:59