Anuncios

Bienvenidos sean a este post, hoy veremos una de las tecnicas de depuracion que disponemos.

Anuncios

En el post anterior hablamos sobre que es la depuracion y mencionamos que existen tecnicas para investigar un codigo, en ese post nos centraremos en la mas basica, rapida y simple pero no recomendaba como es la utilizacion de print en determinadas partes del codigo para ver como es su estado, tambien mencionamos que muchas veces es mas recomendable utilizar una funcion para ello, vamos a crear un ejemplo y primero crearemos la siguiente funcion:

>>> def depurar(*msj, separador=True):
...     print(*msj)
...     if separador:
...             print('-' * 40)
... 
>>>
Anuncios

Esta funcion que llamaremos depurar a la cual le daremos dos atributos, uno para un mensaje y otro de tipo booleano llamado separador, en el bloque mostramos el mensaje pasado y luego un condicional donde verifica si separador es verdadero y en caso de ser cierto creara un separador de texto, con esto terminamos esta funcion, probemos ver como funciona y para ello haremos lo siguiente:

>>> depurar('El dato es...')
El dato es...
----------------------------------------
>>>
Anuncios

En este caso le enviamos una cadena simple y vemos que nos devolvio el mensaje con un separador, probemos lo siguiente:

>>> depurar('Cadenas','diferentes','no son un problema')
Cadenas diferentes no son un problema
----------------------------------------
>>>
Anuncios

Para este caso vemos como podemos pasarles varias cadenas de texto y este las procesara sin inconvenientes, veamos el ultimo ejemplo:

>>> depurar('Un texto final',separador=False)
Un texto final
>>>
Anuncios

En este ultimo ejemplo le pasamos una cadena y le decimos que separador es igual a False mostrando solamente la cadena sin el separador, esto es una forma muy basica de trabajar con una funcion personalizada, para hacer una version mas compleja de esta funcion vamos a crear otro ejemplo que no solo nos mostrara un mensaje sino que calculara el tiempo transcurrido entre funcion y funcion, para ello crearemos un archivo y lo llamaremos tiempo.py y le agregaremos el siguiente codigo:

tiempo.py

from time import sleep

def depurar(*msj, tiempo=[None]):
	print(*msj)
	from time import time
	if tiempo[0] is None:
		tiempo[0] = time()
	else:
		ahora = time()
		print('Tiempo transcurrido: {:.3f}s'
			.format(ahora - tiempo[0]))
		tiempo[0] = ahora

depurar("Codigo salvaje aparece...")
sleep(.3)
depurar("Primer paso realizado...")
sleep(.5)
depurar("Segundo paso realizado...")
Anuncios
Anuncios

En este caso primero importaremos a sleep de time, despues definiremos nuevamente a depurar, en este caso recibimos una cadena y otro atributo llamado tiempo que el valor predeterminado sera None y sera una lista, lo primero que haremos es mostrar el mensaje recibido, luego haremos otra importacion pero de orden local, es decir solo para esta funcion, luego tenemos un condicional donde verifica si la posicion inicial de la lista llamada Tiempo es None a esta posicion la asignaremos el tiempo actual, en caso contrario cuando la posicion inicial haya dejado de ser None crearemos una nuevo objeto llamada ahora y le asignaremos el tiempo actual, luego mostraremos un mensaje donde veremos la diferencia entre el tiempo almacenado en ahora y la posicion inicial de tiempo, por ultimo asignaremos el valor de ahora a la posicion inicial de tiempo, con esto finalizamos la funcion.

Anuncios

Lo siguiente sera el codigo para probarlo, para ello llamamos a depurar con un texto, esto iniciara la funcion, hacemos una demora con sleep y volvemos a llamar a la funcion con otro texto, volvemos a repetir la demora con otro valor y volvemos a llamar a depurar con otro texto, veamos su salida:

tinchicus@dbn001vrt:~/lenguajes/python$ python3 tiempo.py 
Codigo salvaje aparece...
Primer paso realizado...
Tiempo transcurrido: 0.301s
Segundo paso realizado...
Tiempo transcurrido: 0.506s
tinchicus@dbn001vrt:~/lenguajes/python$
Anuncios

Como podemos ver en la primera linea tenemos solo el mensaje y deducimos que se inicio a tiempo, luego tenemos el siguiente mensaje seguido del tiempo transcurrido entre la depuracion original y esta, por ultimo tenemos el ultimo mensaje y el ultimo tiempo transcurrido, vamos a hacer unas ultimas modificaciones y para ello primero agregaremos esta linea antes de la funcion pero despues de la importacion:

depuracion = True
Anuncios

Esta variable tomara mas sentido despues de la siguiente modificacion, esta consistira en modificar las llamadas a depuracion de la siguiente manera:

if depuracion : depurar("Codigo salvaje aparece...")
if depuracion : depurar("Primer paso realizado...")
if depuracion : depurar("Segundo paso realizado...")
Anuncios

Estas modificaciones implican que se ejecutara la llamada a depurar solo si depuracion es True, antes de probarlo veamos como quedo el codigo:

tiempo.py

from time import sleep

depuracion = True

def depurar(*msj, tiempo=[None]):
	print(*msj)
	from time import time
	if tiempo[0] is None:
		tiempo[0] = time()
	else:
		ahora = time()
		print('Tiempo transcurrido: {:.3f}s'
			.format(ahora - tiempo[0]))
		tiempo[0] = ahora

if depuracion : depurar("Codigo salvaje aparece...")
sleep(.3)
if depuracion : depurar("Primer paso realizado...")
sleep(.5)
if depuracion : depurar("Segundo paso realizado...")
Anuncios

Si lo probamos debera funcionar como antes pero tenemos una pequeña diferencia con respecto a lo anterior pero para entender esto veremos el siguiente video

Anuncios

En el video vemos como funciona el codigo pero si cambiamos a depuracion como False las llamadas a depurar no se realizan pero si lo volvemos a setear como True estas vuelven a llamarse, es decir que por medio de una simple tecnica podemos habilitar o deshabilitar la depuracion de nuestro codigo, permitiendo que podamos obtener informacion ante un eventual error o simplemente que trabaje sin notificar a nadie sobre esto, esto es lo que se puede hacer sin necesidad de tener que revisar nuevamente todo el codigo para no dejar ningun elemento de depuracion a la vista.

Anuncios

En resumen, hoy hemos visto una tecnica para hacer depuraciones, hemos visto primero como crear una funcion que nos notificara lo que deseemos, por ejemplo para inidicar que una funcion fue llamada, despues vimos como no solamente mostrar un mensaje sino calcular la diferencia de tiempo entre dos llamadas y por ultimo una tecnica simple para habilitar o deshabilitar la depuracion de un programa, 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

Donación

Es para mantenimento del sitio, gracias!

$1.50