¿Cuál es la práctica común para enums en Python?

Posible duplicado:
¿Cómo puedo representar un ‘enum’ en Python?

¿Cuál es la práctica común para enums en Python? Es decir, ¿cómo se replican en Python?

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

 class Materials: Shaded, Shiny, Transparent, Matte = range(4) >>> print Materials.Matte 3 

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 

También puedes usar miembros de la clase, aunque tendrás que proporcionar tu 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 específica de enumeración, etc.), pruebe esta receta .

No tengo idea de por qué las enumeraciones no son compatibles de forma nativa con Python. La mejor manera que he encontrado para emularlos es anular _ str _ y _ eq _ para que puedas compararlos y cuando usas print () obtienes 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 

Probablemente podrías usar una estructura de herencia, aunque cuanto más jugaba con esto, más sucio me 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