1146 votos

¿Cómo puedo representar un 'Enum' en Python?

Estoy principalmente a C# developer, pero actualmente estoy trabajando en un proyecto en Python.

¿Cómo puedo representar el equivalente de una Enumeración en Python?

1685voto

Alec Thomas Puntos 5815

Las enumeraciones se han añadido a Python 3.4 como se describe en PEP 435. También se ha portado a 3.3, 3.2, 3.1, 2.7, 2.6, 2.5 y 2.4 en pypi.
El uso de backports, haga $ pip install enum34, instalando enum (sin números), se instalará una completamente diferente y la versión incompatible.

from enum import Enum
Animal = Enum('Animal', 'ant bee cat dog')

o lo que es equivalente:

class Animals(Enum):
    ant = 1
    bee = 2
    cat = 3
    dog = 4

En versiones anteriores, una forma de lograr las enumeraciones es:

def enum(**enums):
    return type('Enum', (), enums)

que se usa así:

>>> Numbers = enum(ONE=1, TWO=2, THREE='three')
>>> Numbers.ONE
1
>>> Numbers.TWO
2
>>> Numbers.THREE
'three'

También puede fácilmente el apoyo automático de enumeración con algo como esto:

def enum(*sequential, **named):
    enums = dict(zip(sequential, range(len(sequential))), **named)
    return type('Enum', (), enums)

y se utiliza así:

>>> Numbers = enum('ZERO', 'ONE', 'TWO')
>>> Numbers.ZERO
0
>>> Numbers.ONE
1

Soporte para la conversión de los valores de los nombres pueden ser añadidos de esta forma:

def enum(*sequential, **named):
    enums = dict(zip(sequential, range(len(sequential))), **named)
    reverse = dict((value, key) for key, value in enums.iteritems())
    enums['reverse_mapping'] = reverse
    return type('Enum', (), enums)

Esto sobrescribe nada con ese nombre, pero es útil para representar las enumeraciones en su salida. Tirada de KeyError si la correlación inversa no existe. Con el primer ejemplo:

>>> Numbers.reverse_mapping['three']
'THREE'

563voto

Alexandru Nedelcu Puntos 3801

Antes de PEP-435, Python no tienen un equivalente, pero se podía implementar su propio.

A mí, me gusta mantener las cosas simples (he visto algunos horriblemente complejo de ejemplos en la red), algo como esto ...

class Animal:
    DOG = 1
    CAT = 2

x = Animal.DOG

En Python 3.4 (PEP 435), usted puede hacer la Enumeración de la clase base. Esto se pone un poco de funcionalidad extra, que se describe en el PEP. Por ejemplo, los valores de enumeración son distintos de los números enteros.

class Animal(Enum):
    DOG = 1
    CAT = 2

print(Animal.DOG)
<Animal.DOG: 1>

Si no desea que escriba los valores, utilice el siguiente acceso directo:

class Animal(Enum):
    DOG, CAT = range(2)

247voto

shahjapan Puntos 4043

Aquí es lo que yo uso:

class Enum(set):
    def __getattr__(self, name):
        if name in self:
            return name
        raise AttributeError

Aquí está su implementación:

Animals = Enum(["DOG", "CAT", "HORSE"])

print(Animals.DOG)

131voto

Mark Harrison Puntos 77152

Si usted necesita de los valores numéricos, aquí es la manera más rápida:

dog, cat, rabbit = range(3)

94voto

Ashwin Puntos 17537

La mejor solución para usted dependerá de lo que usted requiere de su falsa enum.

Simple enumeración:

Si usted necesita la enum tan sólo una lista de nombres de identificación de los diferentes elementos, la solución de Mark Harrison (arriba) es genial:

Pen, Pencil, Eraser = range(0, 3)

El uso de un range también te permite asignar cualquier valor inicial:

Pen, Pencil, Eraser = range(9, 12)

En adición a lo anterior, si usted también requieren que los elementos que pertenecen a un contenedor de algún tipo, entonces de integrar en una clase:

class Stationery:
    Pen, Pencil, Eraser = range(0, 3)

El uso de la enumeración elemento, ahora necesitaría utilizar el nombre del contenedor y el nombre del elemento:

stype = Stationery.Pen

Complejo enum:

Para listas largas de enum o más complicado usos de enum, estas soluciones no son suficientes. Usted puede buscar la receta por la Voluntad de la Vajilla para la Simulación de las Enumeraciones en Python publicado en el Python Cookbook. Una versión en línea de la que está disponible aquí.

Más info:

PEP 354: las Enumeraciones en Python tiene de los detalles más interesantes de una propuesta de enum en Python y qué fue rechazada.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X