Domine la depuración en Python: técnicas eficientes y mejores prácticas

Depurar código Python, para muchos de nosotros, se reduce a añadir sentencias print e intentar razonar qué ocurre basándose en la salida. No es ideal, pero por alguna razón, la gente no quiere tocar el depurador de Python.
Usar print para depurar
Si eres de los que usan print para depurar, no te juzgo. Aprender Python es difícil. Programar es difícil. La vida es difícil. Entiendo que aprender otra cosa más parezca agotador si ya estás luchando. Y añadir esa sentencia print a tu código… es más fácil. Una pequeña confesión: yo también lo hago a menudo. No es tan malo como algunos pintan.
Dicho esto, te voy a enseñar un pequeño truco que será tan fácil como añadir sentencias print a tu código. Sin embargo, este truco te da poderes de depuración infinitos y te permitirá conquistar el mundo, si fuera necesario.
Establecer un punto de interrupción (breakpoint) en Python
No necesitas un IDE para depurar tu código correctamente. Este truco siempre funciona, incluso en el editor más simple, e incluso en Jupyter Notebooks.
El truco consiste en esto: establecer un punto de interrupción usando la instrucción breakpoint(). Puedes insertarla en tu código, sin importar qué editor o IDE uses, en el punto donde normalmente pondrías esa molesta sentencia print.
¿Qué pasa cuando lo haces? ¡Veamos! Crea un programa simple, como el siguiente:
def add_two(x):
return x + 2
for i in range(1, 10):
a = add_two(i)
breakpoint()
print(a)
Cuando ejecutas esto, no importa si lo haces en el REPL, desde la línea de comandos o en tu IDE, caes en el depurador de Python llamado PDB. ¿Y ahora qué?
Usar el depurador de Python
Cuando inicio el pequeño programa anterior, esto es lo que ocurre:
$ python3 breakpointing.py
> /home/erik/breakpointing.py(7)<module>()
-> print(a)
(Pdb)_
Hay un par de cosas que ver aquí:
- Muestra el archivo actual que se ejecutó (
breakpointing.py) - Después, muestra el siguiente comando que estaba a punto de ejecutarse, pero fue interrumpido por la llamada a
breakpoint(). - Y finalmente, vemos el prompt de pdb, esperando nuestra entrada.
El depurador de Python es en realidad un shell de Python totalmente funcional, igual que el REPL.
En este punto, podemos inspeccionar el entorno actual. Veamos cuál es el valor de a ahora:
(Pdb) print(a)
3
(Pdb) print(i)
1
En lugar de print, también puedes usar el comando específico de pdb p, así:
(Pdb) p a
3
(Pdb) p i
1
Ejecutar la siguiente línea
¿Qué pasa si queremos ejecutar la siguiente línea de código? Hay dos opciones:
- Con
sostep, ejecutas la línea actual. El depurador se detiene en la primera ocasión posible después de eso. - Con
nonext, también ejecutas la línea actual pero el depurador sigue hasta alcanzar la siguiente línea de la función actual.
Para aclarar: step entra felizmente en una llamada a función y se detiene dentro de esa función. En contraste, next ejecuta la función hasta que retorna, y se detiene en la siguiente línea.
Otros depuradores e IDEs también llaman a esto «step into» (en lugar de step) y «step over» (en lugar de next).
Ahora usemos estos dos:
$ python3 breakpointing.py
-> print(a)
(Pdb) s
3
-> for i in range(1, 10):
(Pdb) s
-> a = add_two(i)
(Pdb) n
-> breakpoint()
(Pdb) n
-> print(a)
(Pdb) n
4
-> for i in range(1, 10):
(Pdb) s
-> a = add_two(i)
(Pdb) s
--Call--
-> def add_two(x):
(Pdb) s
-> return x + 2
(Pdb) s
--Return--
5
-> return x + 2
(Pdb) s
-> breakpoint()
(Pdb)
Como ves, primero pasamos por encima de la llamada a add_two con n. La segunda vez, entramos en la función con s.
Comandos del depurador de Python
Hay más comandos que puedes probar por tu cuenta. No los listaré todos, solo los más útiles:
h(help): imprime todos los comandos disponibles. También toma un argumento, p. ej.h cte dice qué hace el comandoc.c(continue): continúa la ejecución hasta el siguiente breakpoint.l(list): lista el código fuente alrededor de la línea actual.p: imprime el resultado de la expresión siguiente. Puedes usarlo en lugar de llamar aprint().pp: pretty print, útil para imprimir estructuras de datos como diccionarios.restart: reinicia el programa actual.
Para la documentación completa, ve a la página del depurador de Python, donde están listados todos los comandos.
Seguir aprendiendo
Aunque esto puede ser super útil, vale la pena profundizar en el depurador que ofrece tu IDE. Si usas VSCode, escribí un tutorial sobre cómo depurar código Python en VSCode.

python
- Optimizar el Mantenimiento para Impulsar la Eficiencia de la Planta
- Domine el Diseño PCB: Consejos Esenciales y Mejores Prácticas para Ingenieros
- Acelere la Producción: Cómo el Prototipado Mejora su Proceso de Fabricación
- 5 Estrategias Comprobadas para Mejorar la Calidad de Piezas de Chapa Metálica
- 3 Estrategias Probadas para Mejorar su Plan de Mantenimiento de Equipos Industriales
- Maximice beneficios con la gestión de flotas conectadas ampliada de Ford
- Dominando E/S e importación de módulos en Python: Guía práctica
- Función print() en Python: Guía Práctica con Ejemplos
- Domine las Operaciones de Strings en Python: Replace, Join, Split, Reverse y Conversión de Mayúsculas/Minúsculas
- Python time.sleep(): cómo añadir retrasos en tu código (ejemplos)
- Print en Python sin salto de línea: dominando el parámetro end y otras técnicas