Errores y depuración

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:


In [1]:
def func1(a, b):
    return a / b

def func2(x):
    a = x
    b = x - 1
    return func1(a, b)


In [2]:
func2(1)
---------------------------------------------------------------------------
ZeroDivisionError                         Traceback (most recent call last)
<ipython-input-2-b2e110f6fc8f> in <module>()
----> 1 func2(1)

<ipython-input-1-d849e34d61fb> in func2(x)
      5     a = x
      6     b = x - 1
----> 7     return func1(a, b)

<ipython-input-1-d849e34d61fb> in func1(a, b)
      1 def func1(a, b):
----> 2     return a / b
      3 
      4 def func2(x):
      5     a = x

ZeroDivisionError: division by zero


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:


In [3]:
%xmode Plain
Exception reporting mode: Plain


In [4]:
func2(1)
Traceback (most recent call last):

  File "<ipython-input-4-b2e110f6fc8f>", line 1, in <module>
    func2(1)

  File "<ipython-input-1-d849e34d61fb>", line 7, in func2
    return func1(a, b)

  File "<ipython-input-1-d849e34d61fb>", line 2, in func1
    return a / b

ZeroDivisionError: division by zero


El modo Verbose agrega información adicional, incluidos los argumentos de cualquier función que se llame:


In [5]:
%xmode Verbose
Exception reporting mode: Verbose


In [6]:
func2(1)
---------------------------------------------------------------------------
ZeroDivisionError                         Traceback (most recent call last)
<ipython-input-6-b2e110f6fc8f> in <module>()
----> 1 func2(1)
        global func2 = <function func2 at 0x103729320>

<ipython-input-1-d849e34d61fb> in func2(x=1)
      5     a = x
      6     b = x - 1
----> 7     return func1(a, b)
        global func1 = <function func1 at 0x1037294d0>
        a = 1
        b = 0

<ipython-input-1-d849e34d61fb> in func1(a=1, b=0)
      1 def func1(a, b):
----> 2     return a / b
        a = 1
        b = 0
      3 
      4 def func2(x):
      5     a = x

ZeroDivisionError: division by zero


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:


In [7]:
%debug
> <ipython-input-1-d849e34d61fb>(2)func1()
      1 def func1(a, b):
----> 2     return a / b
      3 

ipdb> print(a)
1
ipdb> print(b)
0
ipdb> quit


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í:


In [8]:
%debug
> <ipython-input-1-d849e34d61fb>(2)func1()
      1 def func1(a, b):
----> 2     return a / b
      3 

ipdb> up
> <ipython-input-1-d849e34d61fb>(7)func2()
      5     a = x
      6     b = x - 1
----> 7     return func1(a, b)

ipdb> print(x)
1
ipdb> up
> <ipython-input-6-b2e110f6fc8f>(1)<module>()
----> 1 func2(1)

ipdb> down
> <ipython-input-1-d849e34d61fb>(7)func2()
      5     a = x
      6     b = x - 1
----> 7     return func1(a, b)

ipdb> quit


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:


In [9]:
%xmode Plain
%pdb on
func2(1)
Exception reporting mode: Plain
Automatic pdb calling has been turned ON
Traceback (most recent call last):

  File "<ipython-input-9-569a67d2d312>", line 3, in <module>
    func2(1)

  File "<ipython-input-1-d849e34d61fb>", line 7, in func2
    return func1(a, b)

  File "<ipython-input-1-d849e34d61fb>", line 2, in func1
    return a / b

ZeroDivisionError: division by zero
> <ipython-input-1-d849e34d61fb>(2)func1()
      1 def func1(a, b):
----> 2     return a / b
      3 

ipdb> print(b)
0
ipdb> quit


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 ipdbdocumentación en línea.

JeshuaNomics

JeshuaNomics - DataScience es una web de divulgación donde se puede encontrar material formativo en ciencia de datos y programación estadística (R, Python y SQL).

Publicar un comentario (0)
Artículo Anterior Artículo Siguiente