Anuncios

Bienvenidos sean a este post, hoy veremos el depurador propio del lenguaje.

Anuncios

El depurador propio del lenguaje es llamado pdb, pero en lugar de usarlo directamente se puede implementar la libreria pdbpp la cual aumenta la interface estandar pdb proveyendo algunas herramientas muy convenientes, una de las mas importantes es el modo Sticky la cual nos permite ver una funcion entera mientras pasa por todas las instrucciones.

Anuncios

Si bien hay muchas maneras de usar el depurador pero la mas comun consiste en establecer un breakpoint (punto de detencion) y correr el codigo y cuando se llega a dicho punto la ejecucion se detendra y volvemos a tener accceso con la consola en este punto asi podemos inspeccionar todos los elementos hasta ese momento, inclusive se puede modificar informacion en el momento para cambiar el flujo del programa.

Anuncios

Vamos a crear un ejemplo para entender como trabaja, para este ejemplo los datos vamos a suponer que vienen de un origen que no podemos controlar, para ello primero crearemos un archivo y lo llamaremos depurar.py al cual le agregaremos el siguiente codigo:

depurar.py

di = {'primero': 'v1', 'segundo':'v2', 'cuarto':'v4'}
claves = {'primero','segundo','tercero','cuarto'}

def hacer_algo_con_valor(valor):
	print(valor)

for clave in claves:
	hacer_algo_con_valor(di[clave])

print('Validacion hecha')
Anuncios

Tendremos valores que «recibimos» por medio de JSON y no podemos modificarlos, despues definimos una funcion para mostrar el valor informado, para luego mostrar los valores almacenados en el objeto d por medio de las claves almancenadas a traves de un bucle for a traves de la funcion antes definida, por ultimo mostramos el mensaje de que se realizo la validacion, ejecutemos y veamos que sucede:

tinchicus@dbn001vrt:~/lenguajes/python$ python3 depurar.py 
v4
v1
v2
Traceback (most recent call last):
  File "depurar.py", line 13, in <module>
    hacer_algo_con_valor(di[clave])
KeyError: 'tercero'
tinchicus@dbn001vrt:~/lenguajes/python$
Anuncios
Nota: 
La salida puede variar con respecto a este ejemplo.
Anuncios

Si observan nos devolvio tres valores pero despues nos mostro un error indicando que no se pudo encontrar la clave tercero, y como indica la nota si lo prueban varias veces veremos que se detendra en distintos intentos pero nunca veremos el mensaje final sino siempre el error, con esto realizado tenemos dos posibilidades para usar el depurador de python, la mas comun es:

import pdb
pdb.set_trace()
Anuncios

Aqui primero importamos el modulo de pdb para poder trabajar con el depurador, luego usamos a set_trace para poder ir a la consola y trabajar desde ahi pero a partir de la version 3.7 podemos usar la siguiente funcion:

breakpoint()
Anuncios

Ambas hacen exactamente lo mismo pero la primera es mas universal para cualquier version y la segunda es mas moderna, cualquiera de los dos que usemos se debe aplicar antes del bucle for, veamos nuestro nuevo codigo final:

Nota: 
Por un tema de compatibilidad aplicaremos la primera opcion.
Anuncios

depurar.py

di = {'primero': 'v1', 'segundo':'v2', 'cuarto':'v4'}
claves = {'primero','segundo','tercero','cuarto'}

def hacer_algo_con_valor(valor):
	print(valor)

import pdb
pdb.set_trace()

for clave in claves:
	hacer_algo_con_valor(di[clave])

print('Validacion hecha')
Anuncios

Ahora si pasamos a ejecutarlo se vera de la siguiente manera:

tinchicus@dbn001vrt:~/lenguajes/python$ python3 depurar.py 
> /home/tinchicus/lenguajes/python/depurar.py(10)<module>()
-> for clave in claves:
(Pdb)
Anuncios

Vemos que llega hasta donde le indicamos y a partir de aqui podemos usar varios comandos para las distintas acciones pero esto lo veremos a traves del siguiente video

Anuncios

En el video podemos ver por medio de l donde esta nuestro breakpoint, luego obtuvimos el valor de claves y las claves (keys) de di, por ultimo tenemos una particularidad, vamos a verla:

(Pdb) di['tercero']='lugar libre'
Anuncios

Como sabemos siempre que utilizamos el codigo nos devuelve un error porque no existe la clave ‘tercero’ pero en esta linea se la agregamos y con un valor para que sepamos que se agrego en la depuracion, con esto ahora la clave tercero ya existe y podemos probar para ver su resultado:

(Pdb) c
v4
lugar libre
v2
v1
Validacion hecha
Anuncios

Para ello usamos el comando c de continuar, por lo tanto retoma el bucle y nos muestra todos los valores incluyendo el nuevo valor y el mensaje final que antes no veiamos, como se dieron cuenta esto es una herramienta que nos permite saber donde esta el error y poder agregar un valor y ver su conducta para determinar una solucion para el mismo.

Anuncios

Como nota anecdotica, recuerdan que mencionamos a pdbpp como un adicional para pdb y nos proveia mas herramientas, para instalarlo debemos hacerlo por medio de pip mediante el siguiente comando:

$ python3 -m pip install pdbpp
Anuncios
Nota:
En Windows es muy similar a este para poder instalarlo.
Anuncios

Este instalara todos los modulos necesarios para poder trabajar, para verificar que se instalo correctamente volvamos a probar nuestro codigo pero haremos un par de modificaciones:

depurar.py

d = {'primero': 'v1', 'segundo':'v2', 'cuarto':'v4'}
claves = {'primero','segundo','tercero','cuarto'}

def hacer_algo_con_valor(valor):
        print(valor)

import pdb
pdb.set_trace()

for clave in claves:
        hacer_algo_con_valor(d[clave])

print("Validacion hecha.")
Anuncios

La modificacion mas importante que realizamos fue cambiar al nombre del objeto di por d, dado que antes no hubiera funcionado porque d es un comando de pdb y este se superponia con el nombre impidiendo que trabajemos, si lo volvemos a ejecutar veremos lo siguiente:

tinchicus@dbn001vrt:~/lenguajes/python$ python3 depurar.py 
[0] > /home/tinchicus/lenguajes/python/depurar.py(11)<module>()
-> for clave in claves:
(Pdb++)
Anuncios

Ahora tenemos un prompt distinto pero que trabaja de la misma forma, en este caso la diferencia esta en que disponemos de algunas funciones mas para poder trabajar, tambien cuando veamos el codigo tendremos diferentes colores para visualmente diferenciar entre funciones, literales y variables mejorando un poco la experiencia del depurador, queda a criterio de cada uno utilizarlo de esta forma o de la tradicional.

Anuncios

En resumen, hoy hemos visto a pdb o python debugger, este es un depurador interno de python, hemos mencionado a pdbpp, con una particularidad que nos agrega a la hora de trabajar con el depurador y al final vimos como instalarlo,y verificar que fue instalado correctamente, tambien hemos visto como trabajar con las dos formas basicas del depurador, hemos visto algunos comandos que disponemos y tambien hemos visto como poder probar para solucionar una situacion, espero les haya sido util sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Anuncios
pp258

Donación

Es para mantenimento del sitio, gracias!

$1.50