Deja de depurar Python con print
A pesar que la función breakpoint() existe desde Python 3.7, muchos desarrolladores aún usan print para depurar. Tal vez por desconocimiento o miedo. Por ello, voy a enseñarte un ejemplo rápido.
Supón que tienes un carrito de compras y quieres calcular el total de la compra, aplicando un descuento. Podrías escribir algo así:
def calcular_total(items):
total = 0
for item in items:
breakpoint() # Aquí se detendrá
total += item["precio"] * item["cantidad"]
return total
Al llegar ahí, el programa se detendrá y te dará un prompt (Pdb). Dentro podrás:
- Inspeccionar variables:
p item,p total - Avanzar línea a línea:
n(next) - Entrar en funciones:
s(step) - Continuar hasta el próximo breakpoint:
c(continue) - Salir del depurador:
q(quit)
Además que podrás ejecutar cualquier expresión Python válida, modificar variables, llamar funciones, etc.
Tres formas de ejecutar el script
Ejecución normal
Para depurar, ejecuta el script como siempre. El programa parará en el primer breakpoint() y abrirá la consola interactiva (Pdb):
uv run demo.py
Ignorar todos los breakpoints
El script corre del tirón, sin pausas. Útil cuando ya terminaste de depurar pero no has borrado los breakpoint(), o es para un entorno de producción.
PYTHONBREAKPOINT=0 uv run demo.py
Modo post-mortem
Útil en scripts que no tienen breakpoint(). Corre normal y, si algo falla, te deja la consola pdb justo en el punto del error para inspeccionar el estado exacto en que reventó.
uv run python -m pdb -c continue demo.py
Comandos
| Comando | Acción |
|---|---|
n (next) |
ejecuta la línea actual, sin entrar en funciones |
s (step) |
igual pero entra dentro de la función llamada |
c (continue) |
sigue hasta el próximo breakpoint o el final |
l (list) |
muestra el código alrededor de la línea actual |
p expr |
imprime una variable o expresión: p total |
pp expr |
igual pero con pretty print, útil para dicts y listas |
w (where) |
muestra la pila de llamadas |
a (args) |
muestra los argumentos de la función actual |
r (return) |
ejecuta hasta el return de la función actual |
q (quit) |
aborta la ejecución |
h (help) |
ayuda general; h <comando> para el detalle de uno |
Apuntes finales
Las ventajas de usar breakpoint() y pdb son muchas:
- No ensucia el código con
printque luego hay que borrar. - Permite inspeccionar el estado del programa en cualquier punto.
- Puedes modificar variables y probar cambios al vuelo.
- Paras la ejecución en cualquier momento, no solo cuando hay un error.
Y además, es una herramienta estándar de Python.
Dale una oportunidad y verás cómo mejora tu flujo de trabajo.
¡Feliz depuración!
- Tres formas de ejecutar el script
- Ejecución normal
- Ignorar todos los breakpoints
- Modo post-mortem
- Comandos
- Apuntes finales
Este trabajo está bajo una licencia Attribution-NonCommercial-NoDerivatives 4.0 International.
Apóyame en Ko-fi
Comentarios
Javier Perez
Andros Fenollosa