Usando la nueva función Enum (a través de backport enum34 ) con python 2.7.6.
Dada la siguiente definición, ¿cómo puedo convertir un int al valor de Enum correspondiente?
from enum import Enum
class Fruit(Enum):
Apple = 4
Orange = 5
Pear = 6
Sé que puedo crear a mano una serie de declaraciones if para realizar la conversión, pero ¿hay una forma pitónica fácil de convertir? Básicamente, me gustaría una función ConvertIntToFruit (int) que devuelva un valor de enumeración.
Mi caso de uso es que tengo un archivo csv de registros donde leo cada registro en un objeto. Uno de los campos del archivo es un campo entero que representa una enumeración. Mientras estoy rellenando el objeto, me gustaría convertir ese campo entero del archivo en el valor Enum correspondiente en el objeto.
fuente
Fruit['Orange']
.convert
,coerce
ycast
aunque no toque nada. Parece que la magia fueaccess enum members by name, use item access
. Perfecto, muchas gracias, voy a limpiar mi código con esta sintaxis."foobar" in Fruit.__members__
para probar la membresía e incluso lograrloFruit.get( 'foobar', Fruit.Orange )
para obtener ese sabor Enum predeterminado. Mi código se ve mucho más simplificado al eliminar todos estos andamios de búsqueda de accesorios que establecí anteriormente.Creo que en palabras simples es convertir el
int
valor enEnum
llamandoEnumType(int_value)
, luego acceda alname
delEnum
objeto:my_fruit_from_int = Fruit(5) #convert to int fruit_name = my_fruit_from_int.name #get the name print(fruit_name) #Orange will be printed here
O en función:
def convert_int_to_fruit(int_value): try: my_fruit_from_int = Fruit(int_value) return my_fruit_from_int.name except: return None
fuente
Quería algo similar para poder acceder a cualquier parte del par de valores desde una única referencia. La versión vainilla:
#!/usr/bin/env python3 from enum import IntEnum class 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))
La falla lanza una excepción como se esperaría.
Una versión más robusta:
#!/usr/bin/env python3 class 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]))
Cuando no se usa correctamente, esto evita crear una excepción y, en cambio, devuelve una indicación de falla. Una forma más Pythonic de hacer esto sería devolver "Ninguno" pero mi aplicación particular usa el texto directamente.
fuente
__int__
y__str__
en una instancia de Enum?