Tracks
/
Python
Python
/
Temario
/
Enumeraciones
En

Enumeraciones en Python

1 ejercicio

Acerca de Enumeraciones

En Python, un enum es un conjunto de nombres únicos ligados 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 del enum pueden ser 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 después será un alias del anterior. No se permite usar el mismo nombre para dos miembros diferentes de un enum.

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

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

Recorrer los miembros del enum se puede hacer 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 usando is (operador de identidad) o is not. Los operadores == o != (operadores de igualdad) funcionan de la misma manera:

a = Color.RED

a is Color.RED
#=> True

a == Color.RED
#=> True

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

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

Para no permitir los alias (evitar valores duplicados con nombres distintos), se puede usar el decorador de clase llamado @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 del 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>

Un Enum restringido personalizado se puede escribir heredando de la clase Enum junto con cualquier mix-in o tipo de dato. Por ejemplo:

class StrEnum(str, Enum):
    pass

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

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