martes, 9 de julio de 2019

Facilitando la depuración de programas con breakpoint()




Python 3.7 incluye una mejora que facilita a los desarrolladores el acceso al depurador de programas de Python (Pdb). Antes para poder invocar al depurador era necesario incluir en un programa la siguiente línea:

import pdb; pdb.set_trace()

Esto ya no es necesario. Ahora para depurar el código simplemente tendremos que insertar la función breakpoint() en el lugar o lugares donde se quieran establecer los puntos de interrupción. Con este cambio se persigue facilitar la tarea, hacerla más cómoda e intuitiva.

Después, una vez iniciado el proceso de depuración todo funciona como hasta ahora: cuando se alcanza un punto de interrupción se hace una parada temporal y se devuelve el control al usuario para ejecutar el programa paso a paso (n) o hasta el siguiente punto de interrupción (c), consultar el valor de las variables, etc. Veamos un caso práctico.

El siguiente ejemplo contiene una lista de valores a sumar. Para ello, se recorren, uno a uno, los distintos elementos y se van sumando a la variable acumula, que inicialmente tiene el valor 0. El programa sumando.py genera una excepción cuando se alcanza el cuarto elemento ('a') por ser de tipo cadena; y por no poder sumarse a un valor numérico. En este caso para la depuración se incluye el punto de interrupción justo antes de la suma del elemento en curso para permitir evaluar su valor.

sumando.py:

lista = [2, 1, 3, 'a', 4]
acumula = 0
for valor in lista:
    breakpoint()
    acumula+=valor
    print(acumula)

Para iniciar la depuración, ejecutar:

$ python3 sumando.py

Una vez iniciada, el programa avanzará hasta el punto de interrupción. Después, si escribimos el nombre de alguna de las variables (valor o acumula) y presionamos [return] obtendremos su valor actual. A continuación, al pulsar 'c' y [return] el programa mostrará el resultado de la primera suma y completará un ciclo hasta alcanzar de nuevo el punto de interrupción. Si repetimos la acción y vamos consultando la variable valor observaremos que el error se produce cuando se alcanza el cuarto elemento de la lista:

TypeError: unsupported operand type(s) for +=: 'int' and 'str'

Para obtener ayuda de otras opciones del depurador escribir 'h' y [return]. Para ampliar la información de ayuda de alguna opción escribir: 'h' [opción] y [return]. Y para salir del depurador escribir 'exit', 'quit' o 'q' y [return].

Para ejecutar el programa omitiendo la depuración:

$ PYTHONBREAKPOINT=0 python3 sumando.py

Y para ejecutar el programa con el depurador de consola PuDB:

$ PYTHONBREAKPOINT=pudb.set_trace python3 sumando.py


Relacionado:


Ir al índice del tutorial de Python