Convertir enum a int en python

Tengo una enumeración Nacionalidad:

class Nationality: Poland='PL' Germany='DE' France='FR' 

¿Cómo puedo convertir esto enum a int de esta o similar manera:

 position_of_enum = int(Nationality.Poland) # here I want to get 0 

Sé que puedo hacerlo si tuviera un código por:

 counter=0 for member in dir(Nationality): if getattr(Nationality, member) == code: lookFor = member counter += 1 return counter 

pero no tengo, y de esta manera parece demasiado grande para python. Estoy seguro de que hay algo mucho más sencillo.

Hay mejores (y más “Pythonic”) formas de hacer lo que quieres.

Utilice una tupla (o una lista si es necesario modificarla), donde se conservará el orden:

 code_lookup = ('PL', 'DE', 'FR') return code_lookup.index('PL') 

O use un diccionario a lo largo de las líneas de:

 code_lookup = {'PL':0, 'FR':2, 'DE':3} return code_lookup['PL'] 

El último es preferible, en mi opinión, ya que es más legible y explícito.

Un punto namedtuple también puede ser útil, en su caso específico, aunque probablemente sea excesivo:

 import collections Nationalities = collections.namedtuple('Nationalities', ['Poland', 'France', 'Germany']) nat = Nationalities('PL', 'FR', 'DE') print nat.Poland print nat.index(nat.Germany) 

Usando el backport enum34 o el aenum 1 puede crear un Enum especializado:

 # using enum34 from enum import Enum class Nationality(Enum): PL = 0, 'Poland' DE = 1, 'Germany' FR = 2, 'France' def __new__(cls, value, name): member = object.__new__(cls) member._value_ = value member.fullname = name return member def __int__(self): return self.value 

y en uso:

 >>> print(Nationality.PL) Nationality.PL >>> print(int(Nationality.PL)) 0 >>> print(Nationality.PL.fullname) 'Poland' 

Lo anterior se escribe más fácilmente usando el aenum 1 :

 # using aenum from aenum import Enum, MultiValue class Nationality(Enum): _init_ = 'value fullname' _settings_ = MultiValue PL = 0, 'Poland' DE = 1, 'Germany' FR = 2, 'France' def __int__(self): return self.value 

que tiene la funcionalidad añadida de:

 >>> Nationality('Poland')  

1 Divulgación: Soy el autor de Python stdlib Enum , el enum34 backport y la biblioteca de enumeración avanzada ( aenum ) .

por favor use IntEnum

 from enum import IntEnum class loggertype(IntEnum): Info = 0 Warning = 1 Error = 2 Fetal = 3 int(loggertype.Info) 0 

Usted no puede Python no almacena el orden de los elementos de clase y dir() los devolverá en cualquier orden.

Al ver en su comentario que realmente requiere una asignación de cadenas a enteros, de hecho debe hacer exactamente eso:

 code_lookup = { 'PL': ("Poland", 0), 'DE': ("Germany", 1), 'FR': ("France", 2), ... } 

¿Por qué no define los valores como números en lugar de cadenas?

 class Nationality: POLAND = 0 GERMANY = 1 FRANCE = 2 

Si necesita acceder a los nombres de dos letras, simplemente puede proporcionar una tabla que los asigne. (O un diccionario que mapea al revés, etc.)

He visto algo como:

 PL, FR, DE = range(3) 

Envuélvalo en una clase y viola , tiene un espacio de nombres para la enumeración.