En el tema anterior vimos convenciones de estilo. En proyectos reales no conviene corregir cada espacio, salto de línea e import manualmente. Para eso existen herramientas automáticas.
En este tema usaremos Black para formatear código Python e isort para ordenar imports. El objetivo es que el formato sea consistente y que el equipo pierda menos tiempo en discusiones de estilo.
Black es un formateador automático. Toma un archivo Python válido y lo reescribe con un estilo consistente. No decide nombres, no mejora responsabilidades y no elimina code smells de diseño, pero reduce mucho el ruido visual.
Por ejemplo, este código funciona, pero es incómodo de leer:
def calcular(precio,cantidad,cliente):
total=precio*cantidad
if cliente=="vip": total-=total*0.15
return round(total,2)
Black lo puede convertir en una forma más uniforme:
def calcular(precio, cantidad, cliente):
total = precio * cantidad
if cliente == "vip":
total -= total * 0.15
return round(total, 2)
isort ordena y agrupa imports. Esto evita que cada programador acomode los imports a su manera y facilita detectar dependencias innecesarias.
Ejemplo desordenado:
from ventas import calcular_total_venta
import os
from decimal import Decimal
import requests
from datetime import date
Ejemplo ordenado:
import os
from datetime import date
from decimal import Decimal
import requests
from ventas import calcular_total_venta
Trabajaremos sobre el proyecto ventas_demo creado en temas anteriores. Desde la carpeta del proyecto, activa el entorno virtual.
En Windows PowerShell:
.venv\Scripts\Activate.ps1
En Linux o macOS:
source .venv/bin/activate
Verifica que estás en la carpeta donde se encuentra pyproject.toml.
Instala las herramientas dentro del entorno virtual:
python -m pip install black isort
Comprueba las versiones instaladas:
python -m black --version
python -m isort --version
Usamos python -m para asegurarnos de ejecutar las herramientas del entorno virtual activo.
Agrega esta configuración al archivo pyproject.toml del proyecto:
[tool.black]
line-length = 88
target-version = ["py310"]
[tool.isort]
profile = "black"
line_length = 88
El perfil black en isort hace que ambas herramientas usen criterios compatibles. Así evitamos que una herramienta cambie algo que luego la otra vuelve a modificar.
Crea un archivo llamado src/reporte.py con código deliberadamente mal formateado:
from ventas import calcular_total_venta
import os
from datetime import date
def generar_resumen(productos,cliente,pais):
total=calcular_total_venta(productos,cliente,pais)
return {"fecha":date.today().isoformat(),"cliente":cliente,"pais":pais,"total":total,"directorio":os.getcwd()}
El archivo tiene imports desordenados, falta de espacios, línea larga y una función pegada a los imports.
Antes de formatear, podemos pedirle a Black que revise si cambiaría archivos:
python -m black --check src tests
Si encuentra archivos que no cumplen el formato, informará que los modificaría. Este modo es útil para controles automáticos porque no escribe cambios.
También podemos ver qué cambiaría Black sin modificar el archivo:
python -m black --diff src/reporte.py
El diff permite revisar el impacto antes de aplicar el formateo. En archivos grandes, esto ayuda a separar cambios de estilo de cambios de comportamiento.
Para formatear el archivo, ejecuta:
python -m black src/reporte.py
También puedes formatear todas las carpetas principales del proyecto:
python -m black src tests
Después del formateo, el archivo src/reporte.py debería quedar con una forma similar a esta:
from ventas import calcular_total_venta
import os
from datetime import date
def generar_resumen(productos, cliente, pais):
total = calcular_total_venta(productos, cliente, pais)
return {
"fecha": date.today().isoformat(),
"cliente": cliente,
"pais": pais,
"total": total,
"directorio": os.getcwd(),
}
Black mejora el formato, pero no ordena los imports de la forma esperada. Para eso usaremos isort.
Primero ejecuta isort en modo revisión:
python -m isort --check-only src tests
Si los imports están desordenados, isort informará qué archivos necesitan cambios. Para ver el diff:
python -m isort --diff src/reporte.py
Ejecuta isort sobre el archivo:
python -m isort src/reporte.py
O sobre las carpetas del proyecto:
python -m isort src tests
Ahora los imports deberían quedar ordenados:
import os
from datetime import date
from ventas import calcular_total_venta
Una práctica común es ejecutar primero isort y luego Black:
python -m isort src tests
python -m black src tests
Como isort está configurado con profile = "black", el resultado debería ser estable. Si vuelves a ejecutar ambos comandos, no deberían aparecer cambios nuevos.
El formateo no debería cambiar el comportamiento. Después de aplicar Black e isort, ejecuta:
python -m pytest
Si las pruebas fallan, revisa el archivo. Un formateador trabaja sobre sintaxis válida, pero si hiciste cambios manuales junto con el formateo, podrías haber modificado la lógica accidentalmente.
Conviene documentar los comandos habituales del proyecto en README.md. Por ejemplo:
## Comandos útiles
Ordenar imports:
python -m isort src tests
Formatear código:
python -m black src tests
Ejecutar pruebas:
python -m pytest
Cuando un proyecto tiene comandos visibles, es más fácil que todos los integrantes trabajen de la misma forma.
Black e isort son muy útiles, pero tienen límites. No solucionan todos los problemas de calidad.
Crea el archivo src/clientes.py con este contenido:
import json
from datetime import datetime
import os
def crear_cliente(nombre,email,activo=True):
return {"nombre":nombre,"email":email,"activo":activo,"creado_en":datetime.now().isoformat(),"directorio":os.getcwd()}
Ejecuta los comandos:
python -m isort src/clientes.py
python -m black src/clientes.py
Luego revisa qué cambió y responde: ¿qué partes corrigieron las herramientas y qué problemas de diseño seguirían dependiendo de una persona?
Ejecuta Black e isort sobre todo el proyecto:
python -m isort src tests
python -m black src tests
python -m pytest
Luego realiza estas tareas:
Antes de continuar, verifica que puedes hacer lo siguiente:
pyproject.toml.src y tests.En este tema automatizamos una parte importante del estilo del código. Black nos ayuda a mantener un formato uniforme e isort ordena los imports de manera consistente.
En el próximo tema incorporaremos Ruff, una herramienta de análisis estático que puede detectar problemas antes de ejecutar el programa y complementar el trabajo de Black e isort.