2009-03-31 11 views
114

Duplicar posible:
How can I represent an 'enum' in Python?¿Cuál es la práctica común para las enumeraciones en Python?

¿Cuál es la práctica común para las enumeraciones en Python? Es decir. ¿Cómo se replican en Python?

public enum Materials 
{ 
    Shaded, 
    Shiny, 
    Transparent, 
    Matte 
} 
+11

Ahora hay un tipo de Enum estándar en Python 3.4. Lea esta publicación: http://stackoverflow.com/questions/16653129/future-compatible-enums-in-2-7 – Javier

+2

Aquí está el PEP para el tipo de enumeración que ahora está en Python: https: //www.python. org/dev/peps/pep-0435/ – shuttle87

Respuesta

329
class Materials: 
    Shaded, Shiny, Transparent, Matte = range(4) 

>>> print Materials.Matte 
3 
+14

No había visto eso antes, cosas buenas. –

+0

Buen consejo, gracias. –

+0

El único problema es que necesito que el primer elemento sea 1. ¿Es posible hacerlo con tu método? –

17

que he visto este patrón varias veces:

>>> class Enumeration(object): 
     def __init__(self, names): # or *names, with no .split() 
      for number, name in enumerate(names.split()): 
       setattr(self, name, number) 

>>> foo = Enumeration("bar baz quux") 
>>> foo.quux 
2 

Usted también puede utilizar miembros de la clase, aunque tendrá que proporcionar su propia numeración:

>>> class Foo(object): 
     bar = 0 
     baz = 1 
     quux = 2 

>>> Foo.quux 
2 

Si está buscando algo más robusto (valores dispersos, excepción enum específica, etc.), try this recipe.

8

No tengo idea de por qué los enum no son compatibles de forma nativa con Python. La mejor manera que he encontrado para emularlos es anulando _ str _ y _ eq _ para que pueda compararlos y cuando use print() obtendrá la cadena en lugar del valor numérico.

class enumSeason(): 
    Spring = 0 
    Summer = 1 
    Fall = 2 
    Winter = 3 
    def __init__(self, Type): 
     self.value = Type 
    def __str__(self): 
     if self.value == enumSeason.Spring: 
      return 'Spring' 
     if self.value == enumSeason.Summer: 
      return 'Summer' 
     if self.value == enumSeason.Fall: 
      return 'Fall' 
     if self.value == enumSeason.Winter: 
      return 'Winter' 
    def __eq__(self,y): 
     return self.value==y.value 

Uso:

>>> s = enumSeason(enumSeason.Spring) 

>>> print(s) 

Spring 
+4

PEP354 tiene un aviso de rechazo. Ver http://www.python.org/dev/peps/pep-0354/#rejection-notice –

+4

Sería más rápido tener un diccionario de clase {"Spring": 0, "Summer": 1, ...} y use __init__ para iterar a través de entradas y establecer atributos, porque entonces __str__ podría simplemente mirar el valor hacia arriba en lugar de estar codificado a mano para cada caso. –

+1

Vea esto: https://www.python.org/dev/peps/pep-0435/ – shuttle87

6

que probablemente podría utilizar una estructura de herencia, aunque el más Jugué con esto el más sucio que sentía.

class AnimalEnum: 
    @classmethod 
    def verify(cls, other): 
    return issubclass(other.__class__, cls) 


class Dog(AnimalEnum): 
    pass 

def do_something(thing_that_should_be_an_enum): 
    if not AnimalEnum.verify(thing_that_should_be_an_enum): 
    raise OhGodWhy 
Cuestiones relacionadas