Introducción
El código nunca es perfecto. Siempre tendrás errores. La depuración de código es una habilidad que debes aprender.
Consejos para la depuración
Entonces, tu programa se ha detenido abruptamente...
$ python3 blah.py
Traceback (most recent call last):
File "blah.py", line 13, in?
foo()
File "blah.py", line 10, in foo
bar()
File "blah.py", line 7, in bar
spam()
File "blah.py", 4, in spam
line x.append(3)
AttributeError: 'int' object has no attribute 'append'
¿Y ahora qué?
Leyendo los informes de trazas
La última línea es la causa específica del error.
## Cause of the crash
Sin embargo, no siempre es fácil de leer o entender.
CONSEJO EXPERTO: Pega todo el informe de trazas en Google.
Usando la REPL
Utiliza la opción -i para mantener Python activo al ejecutar un script.
$ python3 -i blah.py
Traceback (most recent call last):
File "blah.py", line 13, in?
foo()
File "blah.py", line 10, in foo
bar()
File "blah.py", line 7, in bar
spam()
File "blah.py", 4, in spam
line x.append(3)
AttributeError: 'int' object has no attribute 'append'
>>>
Preserva el estado del intérprete. Eso significa que puedes investigar después del error. Verificar los valores de las variables y otros estados.
Depuración con Print
La depuración con print() es bastante común.
Consejo: Asegúrate de usar repr()
def spam(x):
print('DEBUG:', repr(x))
...
repr() muestra una representación exacta de un valor. No la salida de impresión bonita.
>>> from decimal import Decimal
>>> x = Decimal('3.4')
## SIN `repr`
>>> print(x)
3.4
## CON `repr`
>>> print(repr(x))
Decimal('3.4')
>>>
El depurador de Python
Puedes lanzar manualmente el depurador dentro de un programa.
def some_function():
...
breakpoint() ## Entra al depurador (Python 3.7+)
...
Esto inicia el depurador en la llamada a breakpoint().
En versiones anteriores de Python, se hacía así. A veces verás esto mencionado en otras guías de depuración.
import pdb
...
pdb.set_trace() ## En lugar de `breakpoint()`
...
Ejecutar bajo el depurador
También puedes ejecutar todo un programa bajo el depurador.
$ python3 -m pdb someprogram.py
Automáticamente entrará al depurador antes de la primera instrucción. Lo que te permite establecer puntos de ruptura y cambiar la configuración.
Comandos comunes del depurador:
(Pdb) help ## Obtener ayuda
(Pdb) w(here) ## Imprimir la traza de pila
(Pdb) d(own) ## Moverse un nivel hacia abajo en la pila
(Pdb) u(p) ## Moverse un nivel hacia arriba en la pila
(Pdb) b(reak) loc ## Establecer un punto de ruptura
(Pdb) s(tep) ## Ejecutar una instrucción
(Pdb) c(ontinue) ## Continuar la ejecución
(Pdb) l(ist) ## Listar el código fuente
(Pdb) a(rgs) ## Imprimir los argumentos de la función actual
(Pdb)!statement ## Ejecutar una instrucción
Para los puntos de ruptura, la ubicación puede ser una de las siguientes.
(Pdb) b 45 ## Línea 45 en el archivo actual
(Pdb) b file.py:45 ## Línea 45 en file.py
(Pdb) b foo ## Función foo() en el archivo actual
(Pdb) b module.foo ## Función foo() en un módulo
Ejercicio 8.4: ¿Bugs? ¿Qué bugs?
¡Funciona! ¡Lánzalo!
Resumen
¡Felicidades! Has completado el laboratorio de depuración. Puedes practicar más laboratorios en LabEx para mejorar tus habilidades.