Enumerations en python
CategoriasProgramaciónPython

Enum en Python

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 😉

Sobre el autor

Comparte:

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Información básica sobre protección de datos
Responsable Óscar Martínez +info...
Finalidad Gestionar y moderar los comentarios +info...
Legitimación Consentimiento del interesado. +info...
Destinatarios No se cederán datos a terceros, salvo obligación legal +info...
Derechos Acceder, rectificar y cancelar los datos, así como otros derechos. +info...
Información adicional Puedes consultar la información adicional y detallada sobre protección de datos en nuestra página de política de privacidad.

Este sitio esta protegido por reCAPTCHA y laPolítica de privacidady losTérminos del servicio de Googlese aplican.

El periodo de verificación de reCAPTCHA ha caducado. Por favor, recarga la página.