Pregunta 1¿Cuál es la ventaja de reemplazar la comparación con literal de cadena "paid" por un Enum?
enum y dataclasses — Constantes con nombre y clases de datos
Este artículo forma parte del Curso de Python, con el que dominarás desde cero las habilidades necesarias para usar Python, desde lo básico hasta lo avanzado.
Aprende a sustituir cadenas literales por Enum, numerar y ordenar con IntEnum + auto(), generar __init__ / __eq__ / __repr__ con @dataclass y usar field(default_factory=list).
Dos módulos para hacer explícito el significado de los valores. enum te permite reemplazar literales de cadena dispersos por todo tu código con constantes con nombre, así que los errores de tipeo aparecen en tiempo de ejecución en lugar de pasar silenciosamente. dataclasses proporciona una manera de definir una "clase que solo guarda datos" en una línea, eliminando el boilerplate de __init__ / __eq__ / __repr__.
Enum — reemplaza literales de cadena con constantes con nombre
Cuando literales de cadena como "paid" / "shipped" están dispersos por tu código, errores de tipeo como "shippped" se cuelan hasta tiempo de ejecución, el autocompletado no ayuda y los refactors son frágiles. Enum soluciona esto definiendo el conjunto de constantes como una clase — los nombres que defines se autocompletan en tu editor, los errores de tipeo lanzan AttributeError inmediatamente, la iteración sobre todos los miembros funciona desde el principio, y obtienes un valor seguro para usar como clave de dict o etiqueta de switch.
# Cadenas de estado dispersas por el código
if status == "paid":
ship_order(order_id)
elif status == "shippped": # Typo — debería ser "shipped", pero no lo notarás hasta tiempo de ejecución
notify_shipped(order_id)
elif status == "cancelled":
refund(order_id)
from enum import Enum
class OrderStatus(Enum):
PENDING = "pending"
PAID = "paid"
SHIPPED = "shipped"
CANCELLED = "cancelled"
# Acceso al miembro: cada miembro lleva un name y un value
print(OrderStatus.PAID) # OrderStatus.PAID
print(OrderStatus.PAID.name) # 'PAID'
print(OrderStatus.PAID.value) # 'paid'
# Compara con ==
status = OrderStatus.PAID
if status == OrderStatus.PAID:
print("Pago recibido")
IntEnum y auto — numeración automática y comparación numérica
IntEnum es un Enum que hereda de int, así que los miembros se comparan y operan aritméticamente como enteros. Es la elección correcta para constantes donde el orden numérico importa — prioridades, niveles, rangos. auto() es una función que asigna valores automáticamente en lugar de escribirlos a mano: alinea las llamadas auto() y se convierten en 1, 2, 3, 4... en orden de definición.
Cuando los números específicos no importan (solo importa el orden), auto() es más seguro porque añadir o eliminar miembros no requiere reescribir números a mano.
1, 2, 3, .... IntEnum se compara como int, así que Priority.LOW < Priority.HIGH funciona — el orden numérico codifica la prioridad.@dataclass — define una clase que guarda datos en una línea
Escribir una "clase plana solo con campos" a mano significa definir __init__ para fijar atributos, __eq__ (el método dunder llamado para las comparaciones ==) para igualdad por contenido, __repr__ (el método dunder llamado por print y el REPL) para una visualización legible, etc. — el mismo patrón boilerplate alineándose cada vez. Un solo decorador @dataclass genera todo eso automáticamente a partir de tus declaraciones de campo con type hints.
En otras palabras, solo alinear atributos con type hints construye toda la clase — obtienes las mismas funcionalidades con mucho menos código que las clases escritas a mano.
Usa default_factory para valores por defecto mutables
Intentar dar como valor por defecto una lista con @dataclass escribiendo items: list = [] lanza un SyntaxError (o un aviso de deprecación). Es una protección contra el bug clásico de "todas las instancias terminan compartiendo la misma lista". Usa field(default_factory=list) en su lugar, que crea una lista vacía nueva por instancia, haciéndolo seguro. La misma idea para dict / set: field(default_factory=dict).
Verificación de conocimientos
Responde cada pregunta una a una.
Pregunta 2¿Cuál es la ventaja de auto() en IntEnum?
Pregunta 3¿Cuál es la forma correcta de dar por defecto una lista a un campo en @dataclass?