Logotipo de Zephyrnet

Python Enum: Cómo crear enumeraciones en Python – KDnuggets

Fecha:

Python Enum: cómo crear enumeraciones en Python
Imagen del autor
 

Si ha programado en un lenguaje como C++ o Java, probablemente haya usado enumeraciones para crear constantes con nombre. Las enumeraciones son útiles cuando tienes una variable que toma uno de un número fijo de valores, a menudo relacionados, como los días de la semana, las calificaciones de los estudiantes, el estado de los pedidos y similares.

Python, sin embargo, no tiene un tipo de datos de enumeración explícito. Pero puedes usar el módulo enum en la biblioteca estándar de Python para crear enumeraciones. Y este tutorial te enseñará cómo hacerlo. 

¡Vamos a empezar!

Enum significa "enumeración" y consta de un conjunto de constantes con nombre predefinidas. Estas constantes suelen estar relacionadas. Los ejemplos comunes incluyen meses del año, días de la semana, calificaciones, estados de pedidos y tareas. 

En resumen: una enumeración es esencialmente una colección de constantes relacionadas, donde cada constante tiene un nombre significativo asociado.

En Python, puedes crear enumeraciones usando el módulo de enumeración (¡lo cual haremos en breve!).

Por qué utilizar enumeraciones

El uso de enumeraciones ayuda a mejorar la claridad y la mantenibilidad del código. Así es cómo: 

  • Las enumeraciones mejoran la claridad del código al reemplazar cadenas o números mágicos con etiquetas significativas. También hacen que el código sea más autodocumentado ya que los nombres de los miembros de la enumeración transmiten su propósito. 
  • Las enumeraciones mejoran la capacidad de mantenimiento del código al proporcionar una forma sencilla de definir y gestionar constantes relacionadas. 
  • Al restringir las asignaciones de variables solo a valores de enumeración válidos, las enumeraciones también garantizan la seguridad de tipos. 
  • Las enumeraciones facilitan la iteración y comparación de constantes relacionadas.

Ahora creemos nuestra primera enumeración en Python.

Crearemos un TaskStatus enumeración que toma los siguientes cuatro nombres y valores:

 

Python Enum: cómo crear enumeraciones en Python
Imagen del autor
 

Primero, importamos el Enum clase del módulo enum para crear enumeraciones. 

Luego definimos una nueva clase. TaskStatus que hereda de Enum para crear una enumeración. Cada miembro se define con un nombre único y un valor opcional como este:

from enum import Enum
	 
class TaskStatus(Enum):
    TODO = 0
    IN_PROGRESS = 1
    DONE = 2
    ABANDONED = -1

 

Todos los miembros de enumeración que creamos son instancias de la clase Enum. Puedes verificarlo llamando al isinstance() función como se muestra:

print(isinstance(TaskStatus.TODO,Enum))

 

Output >>> True

 

Imprimamos todos los miembros del TaskStatus enum convirtiéndolo en una lista:

print(list(TaskStatus))

 

Debería ver el siguiente resultado:

Output >>>

[<TaskStatus.TODO: 0>, <TaskStatus.IN_PROGRESS: 1>, <TaskStatus.DONE: 2>, <TaskStatus.ABANDONED: -1>]

 

Todos los miembros de la enumeración tienen un nombre y propuesta de. Lo que significa que puede acceder a los miembros de enum usando sus nombres, como TaskStatus.TODO. O accedes a ellos por valor, como TaskStatus(0).

Ahora que hemos creado un simple TaskStatus enum, aprendamos cómo realizar tareas simples como iterar sobre los miembros de enum.

Iterando sobre enumeraciones

En Python, puedes trabajar con enumeraciones prácticamente de la misma manera que trabajas con cualquier iterable. Por ejemplo, puedes utilizar el len() función para contar el número de miembros de enumeración:

num_statuses = len(TaskStatus)
print(num_statuses)

 

Output >>> 4

 

También puede iterar sobre enumeraciones de la misma manera que lo haría sobre un iterable de Python, como una lista. En el siguiente bucle for, accedemos tanto al nombre como al valor de cada miembro de la enumeración y los imprimimos:

for status in TaskStatus:
    print(status.name, status.value)

 

Aquí está la salida:

Output >>> 

TODO 0
IN_PROGRESS 1
DONE 2
ABANDONED -1

Ordenar en enumeraciones

En el ejemplo, el estado y el valor numérico correspondiente son los siguientes:

  • TODO: 0
  • EN_PROGRESO: 1
  • HECHO: 2
  • ABANDONADO: -1

Pero también puedes usar el orden predeterminado usando el auto() función auxiliar. Cuando lo haga, si tiene 'n' miembros en la enumeración, los valores asignados son del 1 al n. Pero puedes pasar un valor inicial, digamos k, auto(k) para que la enumeración comience en k y suba hasta k + n.

Modifiquemos el TaskStatus enumeración como se muestra:

from enum import Enum, auto

class TaskStatus(Enum):
    TODO = auto()
    IN_PROGRESS = auto()
    DONE = auto()
    ABANDONED = auto()

 

Ahora imprimamos los miembros:

print(list(TaskStatus))

 

Vemos que los valores son del 1 al 4 como se esperaba:

Output >>>

[<TaskStatus.TODO: 1>, <TaskStatus.IN_PROGRESS: 2>, <TaskStatus.DONE: 3>, <TaskStatus.ABANDONED: 4>]

Ahora construyamos sobre el TaskStatus enumeración que tenemos. Cree un archivo task.py en su directorio de trabajo con la siguiente versión de la enumeración:

# task.py

from enum import Enum

class TaskState(Enum):
    TODO = 0
    IN_PROGRESS = 1
    DONE = 2
    ABANDONED = -1

 

Digamos que tenemos una tarea con un nombre y un estado actual. Y las transiciones válidas entre estados son las que se muestran:

 

Python Enum: cómo crear enumeraciones en Python
Imagen del autor
 

Vamos a crear un Task clase:

class Task:
    def __init__(self, name, state):
        self.name = name
        self.state = state
    
    def update_state(self, new_state):
        # Define valid state transitions based on the current state
        valid_transitions = {
        	TaskState.TODO: [TaskState.IN_PROGRESS, TaskState.ABANDONED],
        	TaskState.IN_PROGRESS: [TaskState.DONE, TaskState.ABANDONED],
        	TaskState.DONE: [],
        	TaskState.ABANDONED: []
    	}
   	 
        # Check if the new state is a valid transition from the current state
        if new_state in valid_transitions[self.state]:
            self.state = new_state
        else:
            raise ValueError(f"Invalid state transition from {self.state.name} to {new_state.name}")

 

Tenemos una update_status() Método que comprueba si la transición al nuevo estado es válida dado el estado actual. Para transiciones no válidas, se genera una excepción ValueError.

Aquí hay una instancia de la Task clase: la tarea “Escribir informe” con estado TODO:

# Create a new task with the initial state "To Do"
task = Task("Write Report", TaskState.TODO)

# Print the task details
print(f"Task Name: {task.name}")
print(f"Current State: {task.state.name}")

 

Output >>>
Task Name: Write Report
Current State: TODO

 

Actualizar el estado de la tarea a IN_PROGRESS debería funcionar ya que es una transición de estado válida:

# Update the task state to "In Progress"
task.update_state(TaskState.IN_PROGRESS)
print(f"Updated State: {task.state.name}")

 

Output >>> Updated State: IN_PROGRESS

 

Y una vez completada la tarea, podemos actualizar su estado a HECHO:

# Update the task state to "DONE"
task.update_state(TaskState.DONE)
print(f"Updated State: {task.state.name}")

 

Output >>> Updated State: DONE

 

Pero si intenta actualizar el estado a uno no válido, como intentar actualizar DONE a TODO, se encontrará con la excepción ValueError:

# Attempt to update the task state to an invalid state
task.update_state(TaskState.TODO)

 

Aquí está el rastreo del ValueError generado debido a una transición de estado no válida de DONE a TODO:

Traceback (most recent call last):
  File "/home/balapriya/enums/task.py", line 46, in 
	task.update_state(TaskState.TODO)
  File "/home/balapriya/enums/task.py", line 30, in update_state
	raise ValueError(f"Invalid state transition from {self.state.name} to {new_state.name}")
ValueError: Invalid state transition from DONE to TODO

En este tutorial, aprendimos cómo crear enumeraciones en Python codificando una enumeración TaskStatus simple. Aprendimos cómo acceder a los miembros de enum e iterar sobre ellos. 

Además, aprendimos cómo funciona el pedido predeterminado si elige utilizar el auto() Función auxiliar para establecer los valores de los miembros de enumeración. Luego intentamos usar la enumeración TaskStatus en un ejemplo más útil. 

Usted puede encontrar el ejemplos de código en GitHub. Los veré a todos pronto en otro tutorial de Python. Hasta entonces, ¡feliz codificación!
 
 

Bala Priya C. es un desarrollador y escritor técnico de la India. Le gusta trabajar en la intersección de matemáticas, programación, ciencia de datos y creación de contenido. Sus áreas de interés y experiencia incluyen DevOps, ciencia de datos y procesamiento de lenguaje natural. ¡Le gusta leer, escribir, codificar y tomar café! Actualmente, está trabajando para aprender y compartir su conocimiento con la comunidad de desarrolladores mediante la creación de tutoriales, guías prácticas, artículos de opinión y más.

punto_img

Información más reciente

punto_img