Introducción
El código nunca es perfecto. Siempre tendrás errores. La depuración de código es una habilidad que debes aprender.
This tutorial is from open-source community. Access the source code
El código nunca es perfecto. Siempre tendrás errores. La depuración de código es una habilidad que debes aprender.
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é?
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.
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.
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')
>>>
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()`
...
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
¡Funciona! ¡Lánzalo!
¡Felicidades! Has completado el laboratorio de depuración. Puedes practicar más laboratorios en LabEx para mejorar tus habilidades.