Tracks
/
Python
Python
/
Temario
/
Enumeraciones
En

Enumeraciones en Python

1 ejercicio

Acerca de Enumeraciones

En Python, un enum es un conjunto de nombres únicos vinculados a valores únicos y constantes. Los Enums se definen heredando de una clase Enum. Los tipos de enum integrados están disponibles en el módulo enum y la clase Enum se puede importar con from enum import Enum.

from enum import Enum

class Color(Enum):
    RED = 1
    GREEN = 2

Ten en cuenta que los valores de los miembros de un enum pueden ser de cualquier tipo de dato, como str, tuple, float, etc.

class Color(Enum):
    RED = 'red'
    GREEN = 'green'

Los Enums también se pueden crear usando la sintaxis de llamada a función.

from enum import Enum

Animal = Enum('Animal', 'ANT BEE CAT DOG')
list(Animal)
#=> [<Animal.ANT: 1>, <Animal.BEE: 2>, <Animal.CAT: 3>, <Animal.DOG: 4>]

Animal.ANT.value
#=> 1

Cuando se asigna el mismo valor a dos miembros de un enum, el miembro asignado en segundo lugar será un alias del primero. No se permite usar el mismo nombre para dos miembros distintos de un enum.

class Color(Enum):
    RED = 1
    GREEN = 2
    ALIAS_OF_RED = 1

Color.ALIAS_OF_RED
#=> <Color.RED: 1>

Se puede iterar por los miembros del enum con la sintaxis estándar for member in:

for member in Color:
    print((member.name, member.value))
#=> (RED, 1)
#=> (GREEN, 2)

# __members__.items() helps you to loop through alias as well
for member in Color.__members__.items():
    print(member)
#=> ('RED', <Color.RED: 1>)
#=> ('GREEN', <Color.GREEN: 2>)
#=> ('ALIAS_OF_RED', <Color.RED: 1>)

Los miembros de un Enum se pueden comparar con is (operador de identidad) o is not. Los operadores == o != (operadores de igualdad) funcionan igual:

a = Color.RED

a is Color.RED
#=> True

a == Color.RED
#=> True

Para asignar valores enteros, la función auto() empieza por 1 y asigna automáticamente los valores siguientes.

class Shape(Enum):
    CIRCLE = auto()
    SQUARE = auto()
    OVAL = auto()

Para no permitir el alias (evitando valores duplicados con nombres distintos), se puede usar el decorador de clase @enum.unique.

@enum.unique
class Shape(Enum):
    CIRCLE = 1
    SQUARE = 2
    TRIANGLE = 1
#=> ValueError: duplicate values found in <enum 'Shape'>: TRIANGLE -> CIRCLE

Para acceder a un miembro de un enum a partir de un valor dado, se puede usar esta notación: <EnumName>(<value>).

g = Color(2)

g is Color.GREEN
#=> True

g
#=> <Color.GREEN: 2>

Se puede escribir un Enum restringido personalizado creando una subclase de Enum con cualquier mix-in o tipo de dato. Por ejemplo:

class StrEnum(str, Enum):
    pass

Solo se permite crear una subclase de Enum si el enum no define ningún miembro. Consulta la guía práctica de enum y el recetario de enum para ver más detalles y explicaciones.

Editar en GitHub El enlace se abre en una nueva ventana o pestaña