Errores y depuración
El desarrollo de código y el análisis de datos siempre requieren un poco de prueba y error, e IPython contiene herramientas para agilizar este proceso. Esta sección cubrirá brevemente algunas opciones para controlar los informes de excepciones de Python, seguido de herramientas de exploración para depurar errores en el código.
Control de excepciones: %xmode
¶
La mayoría de las veces, cuando falla una secuencia de comandos de Python, generará una excepción. Cuando el intérprete llega a una de estas excepciones, la información sobre la causa del error se puede encontrar en el traceback, al que se puede acceder desde Python. Con la función mágica %xmode
, IPython le permite controlar la cantidad de información impresa cuando se genera la excepción. Considere el siguiente código:
def func1(a, b):
return a / b
def func2(x):
a = x
b = x - 1
return func1(a, b)
func2(1)
Llamar a func2
da como resultado un error, y leer la traza impresa nos permite ver exactamente qué sucedió. De forma predeterminada, esta traza incluye varias líneas que muestran el contexto de cada paso que conduce al error. Usando la función mágica %xmode
(abreviatura de modo de excepción), podemos cambiar la información que se imprime.
En este caso, % xmode
toma un solo argumento, el modo, y hay tres posibilidades: Plain
, Context
y Verbose
. El valor predeterminado es Context
, y da un resultado como el que se muestra antes. Plain
es más compacto y proporciona menos información:
%xmode Plain
func2(1)
El modo Verbose
agrega información adicional, incluidos los argumentos de cualquier función que se llame:
%xmode Verbose
func2(1)
Esta información adicional puede ayudar a precisar por qué se plantea la excepción. Entonces, ¿por qué no utilizar el modo Verbose
todo el tiempo? A medida que el código se complica, este tipo de rastreo puede volverse extremadamente largo. Dependiendo del contexto, a veces es más fácil trabajar con la brevedad del modo Default
.
Depuración:
Cuando leer las trazas no es suficiente¶
La herramienta estándar de Python para la depuración interactiva es pdb
, el depurador de Python. Este depurador permite al usuario recorrer el código línea por línea para ver qué podría estar causando un error más difícil. La versión mejorada de IPython de esto es ipdb
, el depurador de IPython.
Hay muchas formas de iniciar y utilizar estos dos depuradores; no los cubriremos completamente aquí. Consulte la documentación en línea de estas dos utilidades para obtener más información.
En IPython, quizás la interfaz más conveniente para la depuración es el comando mágico %debug
. Si lo llama después de hacer clic en una excepción, se abrirá automáticamente un mensaje de depuración interactivo en el punto de la excepción. El indicador ipdb
le permite explorar el estado actual de la pila, explorar las variables disponibles e incluso ejecutar comandos de Python.
Veamos la excepción más reciente, luego hagamos algunas tareas básicas: imprima los valores de a
y b
, y escriba quit
para salir de la depuración. sesión:
%debug
Sin embargo, el depurador interactivo permite mucho más que esto; incluso podemos subir y bajar por la pila y explorar los valores de las variables allí:
%debug
Esto le permite descubrir rápidamente no solo qué causó el error, sino qué llamadas de función llevaron al error.
Si desea que el depurador se inicie automáticamente siempre que se genere una excepción, puede usar la función mágica %pdb
para activar este comportamiento automático:
%xmode Plain
%pdb on
func2(1)
Finalmente, si tiene un script que le gustaría ejecutar desde el principio en modo interactivo, puede ejecutarlo con el comando %run -d
, y usar el comando next
para recorrer las líneas de código de forma interactiva.
Lista parcial de comandos de depuración¶
Hay muchos más comandos disponibles para la depuración interactiva de los que hemos enumerado aquí; la siguiente tabla contiene una descripción de algunos de los más comunes y útiles:
Comando | Descripción |
---|---|
list |
Muestra la ubicación actual en el archivo. |
h(elp) |
Muestre una lista de comandos o busque ayuda sobre un comando específico |
q(uit) |
Salga del depurador y del programa |
c(ontinue) |
Salga del depurador, continúe en el programa |
n(ext) |
Ir al siguiente paso del programa |
<enter> |
Repetir el comando anterior |
p(rint) |
Imprimir variables |
s(tep) |
Paso en una subrutina |
r(eturn) |
Volver fuera de una subrutina |
Para obtener más información, use el comando help
en el depurador, o eche un vistazo a ipdb
documentación en línea.