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.