Depuración y optimziación del código en python para hacer mejor nuestro código

Depuración y optimziación del código en python para hacer mejor nuestro código

En esta lección vamos a ver como podemos optimziar nustro código, una parte importante de la codificación donde realizamos el proceso de programacion y luego corregimos los errores. Este proceso también lo podemos conocer como debugging porque es un trabajo que realmente es eliminar bugs (errores en programación).

Depuración de código en python

En python para depurar solemos utilizar utilizar un depurador, que en Python el rey por estrella es pdb (python DeBugger). Con la herramienta pdb es posible insertar puntos de parada dentro del código fuente sin necesidad de usar un IDE o herramientas externas. Cómo cualquier otro depurador, pdb está dotado de las capacidades necesarias para poder imprimir el valor de las variables en un determinado punto de la ejecució del código. Para poder ver mejor el ejemplo tenemos que crear uno donde lo podamos seguir y ver de mejor manera.


	# demo_pdb.py
from dataclasses import dataclass

@dataclass
class Product:
	sku: str
	price: float

	def apply_discount(price: float, discount_pct: float) -> float:
		# BUG intencional: si discount_pct viene como "20" en lugar de 0.20,
		# el cálculo es incorrecto.
		return price - (price * discount_pct)

	def parse_discount(user_input: str) -> float:
		# El usuario introduce "20" para 20%
		return float(user_input)

	def total_cart(products: list[Product], discount_input: str) -> float:
		discount = parse_discount(discount_input)
		subtotal = sum(p.price for p in products)
		total = apply_discount(subtotal, discount)
		return round(total, 2)

	def main():
		cart = [
		Product("A-001", 19.99),
		Product("B-002", 5.50),
		Product("C-003", 13.25),
		]
		discount_input = "20"  # el usuario cree que es 20%
	 	total = total_cart(cart, discount_input)
	 	print("TOTAL:", total)

if __name__ == "__main__":
	main()

Como veis aquí tenemos el código y he dejado marcado el error que tiene el código para que podamos hacer un seguimiento más fácil.

Librería de pdb de python

La librería de pdb ya viene instalado en nuestro python por defecto, es decir, no tenemos que hacer ningún pip o uv add en nuestra treminal o nuestro código. Lo cierto que es algo que tenemos que agradecer ya que como podemos comprobar nos viene nuestro lenguaje muy bien preparado para poderlo utilizar no solamente en IDEs. Si bien es cierto ya viene instalado, normalmente las IDEs es con lo que suelen trabajar por debajo para la ejecución de nuestro código, herramientas tan famosas como Visual Studio Code o incluso Windsorf. Para nuestra tarea vamos a trabajar con los siguientes códigos una vez habramos desde la terminal:

Estos van a ser los códigos que vamos a usar dentro de nuestro debugging que vamos a explicar ahora paso a paso.

Código con breakpoint

Con este código que hemos marcado, el *breakopoint* lo que tenemos es una zona de pausa de nuestro código, una forma de trabajar la depuración de nuestro código si queremos tener un control en cierto paso o pasos dentro del código que has realizado.

from dataclasses import dataclass


@dataclass
class Product:
    sku: str
    price: str

def apply_discount(price:float, discount_pct: float )-> float:
    # BUG intenacional: si discoutn_pct viene como "20" en lugar de 0.20
    # el cálculo es incorrecto
    return price - (price * discount_pct)

def parse_discount(user_input:str)-> float:
    # El usuario introduce "20" para el 20%
    return float(user_input)

def total_cart(products: list[Product], discount_input: str) -> float:
    discount = parse_discount(discount_input)
    breakpoint() #Esto lo añadimos después y es desde la versión 3.7 de Python
    subtotal = sum(p.price for p in products)
    total = apply_discount(subtotal, discount)
    return round(total, 2)

def main():
    cart = [
            Product("A-001", 19.99),
            Product("B-002", 5.50),
            Product("C-003", 13.25),
            ]
    discount_input = "20" # el usuario cree que el 20%
    total = total_cart(cart, discount_input)
    print("Total: ", total)

if __name__=="__main__":
    main()

Vamos a trabajar con la terminal

En el código hemos insertado el código como estamos viendo en la función de total_cart para que se detenga en ese punto y tener un control.

Arrancamos nuestro debugging

En la imagen estamos arrancando nuestro código (es el mismo que tenemos arriba en el ejemplo) y para ello necesitamos escribir dentro del directorio donde tenemos el código lo siguiente:

Realizando un listado en pdb

Cuando introducimos l lo que llama un listado, nos enumera el código fuente del archivo que estamos debuggeando.

Nuestro primer break

En este caso el código que vamos a introducir es la b más el nombre de variable que en este caso hemos usado el nombre de la función, pero podíamos usar el número de línea, que es lo que normalmente utiliza por ejemplo Visual Studio Code. Este breakopoint lo podemos poner incluso, en proyectos más modulares con condicionales o incluso el nombre del archivo más número de línea por ejemplo. En el caso de los breakopoint te voy a poner un pequeño listado que te sirva de como o cuando usar cada uno:

C el código que nos ayuda a contnuar

Nos ayudamos de c para decir a nustro debugger que continue hasta el breakopoint real o bien hasta el siguiente que tengamos, pero en este caso es hasta el único que tenemos.

paso c de continuar en pdb

Mostrando por pantalla las variables

Pdb nos ayuda a saber que tenemos en una variables y es que si utilizamos p <variable> podemos saber que es lo que nos mostraría esa variable en cuestión. Esto es muy útil para trabajar los ya comentados brekpoints con condicionales.

Presntando en pantalla

Conclusión:

Cómo podéis ver este debugger es muy útil y puede ser una gran herramienta que si bien es cierto en los IDEs podemos trabajarlo de manera nativa con estos, si en un momento dado os pasa como a mi que empezáis a buscar otros caminos donde expandir tus sitios de codear o bien tienes que hacer algo más personalizado siempre viene bien conocer esta librería que ya viene dentro de Python y como podéis usarlo para controlar vuestro código.

¿Listo para hacer crecer tu negocio?

Analicemos tu proyecto y definamos la estrategia perfecta para alcanzar tus objetivos

Solicitar consultoría gratuita