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:
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:
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.
- Distribución de relaciones públicas y contenido potenciado por SEO. Consiga amplificado hoy.
- PlatoData.Network Vertical Generativo Ai. Empodérate. Accede Aquí.
- PlatoAiStream. Inteligencia Web3. Conocimiento amplificado. Accede Aquí.
- PlatoESG. Carbón, tecnología limpia, Energía, Ambiente, Solar, Gestión de residuos. Accede Aquí.
- PlatoSalud. Inteligencia en Biotecnología y Ensayos Clínicos. Accede Aquí.
- Fuente: https://www.kdnuggets.com/python-enum-how-to-build-enumerations-in-python?utm_source=rss&utm_medium=rss&utm_campaign=python-enum-how-to-build-enumerations-in-python