Hace tiempo hable sobre «los enums en PHP» aquí y, dado que también a veces «tonteo» con Python, me he decidido a crear este pequeño articulo relacionado con «las enumeraciones», «enumerations» o «enums» en el lenguaje Python. También, todo hay que decirlo, de esta manera me estreno hablando de Python por primera vez en el blog ;-P
Empecemos.
Los enumerations, en adelante «enums», aparecieron en Python en la versión 3.4 del lenguaje.
Un enum, es un tipo de dato que nos permite definir un conjunto de valores constantes.
Con ellos pretendemos representar un conjunto fijo de valores constantes relacionados. De esta manera obtenemos un código más fácil de leer, entender y mantener.
¿Cómo se usan los ENUM en Python?
Sencillo. Supongamos que queremos gestionar los pedidos de una tienda. Cada pedido deberá de tener un estado diferente.
Para que el ejemplo resulte más sencillo vamos a suponer solo tres estados posibles, es decir, un pedido podrá tener el estado de «pendiente», «enviado» y «entregado».
Ahora bien, para usar los enum en Python, primero de todo será importar el módulo «enum»:
from enum import Enum
Y a continuación, definimos el enum así:
class EstadoPedido(Enum): PENDIENTE = "Pendiente" ENVIADO = "Enviado" ENTREGADO = "Entregado"
Ahora, ¿cómo accedemos a los miembros o constantes del enum?
Ponemos el nombre de la clase, seguido de un punto y el nombre del miembro o constante y, por último «.value».
Por ejemplo:
print(EstadoPedido.PENDIENTE.value)
.value es utilizado para obtener el valor asociado con el miembro del Enum.
A parte de «.value», podemos usar otros atributos y métodos sobre los enums, los cuales son los siguientes:
.name: Devuelve el nombre del miembro del Enum.
print(EstadoPedido.PENDIENTE.name) # imprime PENDIENTE
Por cierto, podemos combinar «.name» y «.value» y así iterar sobre cada miembro:
for estado in EstadoPedido: print(f"Nombre: {estado.name}, Valor: {estado.value}")
.members: Mapea todos los nombres y miembros del Enum.
print(EstadoPedido.__members__)
Imprimiendo en pantalla:
{'PENDIENTE': <EstadoPedido.PENDIENTE: 'Pendiente'>, 'ENVIADO': <EstadoPedido.ENVIADO: 'Enviado'>, 'ENTREGADO': <EstadoPedido.ENTREGADO: 'Entregado'>}
.items: Devuelve una lista de tuplas con los nombres y miembros del Enum.
La salida por pantalla sería:
Nombre: PENDIENTE, Miembro: EstadoPedido.PENDIENTE Nombre: ENVIADO, Miembro: EstadoPedido.ENVIADO Nombre: ENTREGADO, Miembro: EstadoPedido.ENTREGADO
Visto todo esto, ahora podemos ampliar un poco más nuestro ejemplo y crear una clase para gestionar los pedidos.
Por ejemplo:
class Pedido: def __init__(self, id, estado=EstadoPedido.PENDIENTE): self.id = id self.estado = estado def actualizar_estado(self, nuevo_estado): if not isinstance(nuevo_estado, EstadoPedido): raise ValueError("Estado no válido") self.estado = nuevo_estado def __str__(self): return f"Pedido {self.id}: {self.estado.value}"
Es bastante sencilla y descriptiva la clase.
Cuando se crea un pedido, por defecto su estado será «pendiente».
Después tenemos un método llamado «actualizar_estado» que aparte de actualizar el estado del pedido (obvio), nos avisa si le pasamos un estado no válido.
El uso de la clase podría hacerse así:
# Creamos un nuevo pedido pedido = Pedido(1) # Imprimimos el estado inicial del pedido print(pedido) # Pendiente # Actualizar estado del pedido pedido.actualizar_estado(EstadoPedido.ENVIADO) print(pedido) # Enviado # Intentar actualizar con un estado no válido try: pedido.actualizar_estado("Cancelado") except ValueError as e: print(e) # No válido # Actualizar estado a "Entregado" pedido.actualizar_estado(EstadoPedido.ENTREGADO) print(pedido) # Entregado
Y hasta aquí los «enum en Python».
Como ves son fáciles de usar y nos permiten mejorar la legibilidad y mantenimiento de nuestro código. Eso es todo por ahora. Espero que te haya gustado esta introducción a las enumeraciones 😉