Herramientas modernas de desarrollo en Python#

Este es el artículo número 5 de la serie de tutoriales de Django Ninja.
En el desarrollo de software moderno, las herramientas no solo aumentan la eficiencia del desarrollo, sino que también mejoran la calidad del código, haciendo que la gestión y el mantenimiento de los proyectos sean mucho más sencillos.
Este artículo presentará varias herramientas clave para el desarrollo en Python, analizando su aplicación en los proyectos para permitir a los lectores comprender rápidamente su posicionamiento y valor.
Si has leído mi blog, probablemente habrás notado que he dedicado un espacio considerable a promover ampliamente estas herramientas modernas de desarrollo, redactando detallados tutoriales artículo tras artículo.
Por lo tanto, no profundizaremos en los detalles operativos de estas herramientas, sino que nos enfocaremos en los conceptos y en cómo resuelven los problemas reales en el desarrollo. Incluiré enlaces a los artículos tutoriales correspondientes para que los lectores interesados puedan profundizar.
Cabe mencionar que estas prácticas de desarrollo moderno en Python fueron aprendidas e implementadas progresivamente por mí tras leer la serie «Python Table Manners» del desarrollador Wei Lee (李唯). ¡Recomiendo encarecidamente esta serie!
Proyecto de ejemplo en GitHub#
Este proyecto utiliza Python 3.12.5, Django 4.2 LTS y Django Ninja 1.3.0; basta con tener presente esta información.
Pasemos ahora a la presentación de cada una de las herramientas.
pyenv: gestión de versiones de Python#
pyenv (sí, su letra p es en minúscula, al igual que pytest) es una potente herramienta para gestionar múltiples versiones de Python, que te permite utilizar diferentes versiones de Python en distintos proyectos sin generar conflictos.
Esta es la razón por la cual existe un archivo .python-version en el proyecto: declara ante pyenv la versión de Python utilizada por el proyecto.
pyenv resulta especialmente útil al trabajar con múltiples proyectos que emplean diferentes versiones de Python, sobre todo cuando algunos de ellos requieren versiones antiguas de Python.
Gracias a pyenv, puedes instalar y cambiar fácilmente de versión de Python, garantizando que cada proyecto se ejecute en el entorno adecuado.
Para tutoriales detallados sobre pyenv, puedes consultar lo que he escrito anteriormente:
- Instalación y uso de pyenv + pyenv-virtualenv en Ubuntu (Linux)
- Adiós a Anaconda: Creación de un entorno de desarrollo Python en macOS con pyenv (macOS)
Poetry: entornos virtuales y gestión de paquetes#
Poetry es una herramienta de gestión de paquetes de Python sumamente popular hoy en día; y la gestión de paquetes —especialmente los problemas de «dependencias» entre ellos— ha sido históricamente una gran dificultad en el desarrollo con Python.
Poetry resuelve principalmente el conflicto de rangos de versiones de dependencias entre diferentes paquetes.
Es difícil explicar todos estos detalles en pocas palabras; puedes consultar mi artículo «Gestor de paquetes de Python — Guía completa de inicio a Poetry», especialmente la sección de «Glosario».
Además, como Poetry involucra la gestión de entornos virtuales, cómo utilizarlo junto con pyenv para que el entorno virtual seleccione la versión correcta de Python también es una duda común. Puedes consultar la guía en el artículo «Tutorial de Poetry + pyenv: Comandos frecuentes y recomendaciones».
Ruff: linter y formatter#
Los tiempos cambian: antes usaba la combinación Flake8 + isort + Black, pero ahora uso Ruff para todo.
Ruff es un linter y formatter ultrarrápido para Python, escrito en Rust, diseñado para verificar y corregir rápidamente problemas de formato en el código.

Ruff ayuda a los desarrolladores a mantener un estilo de código unificado (principalmente conforme a PEP8). Debido a su altísimo rendimiento, Ruff es especialmente adecuado para proyectos a gran escala.
Además, Ruff puede integrar numerosos complementos de Flake8, convirtiéndose en una solución All-in-One. Para mí, este es otro gran atractivo además de su velocidad.
Para más detalles sobre Ruff, puedes consultar mis artículos:
- Desarrollo en Python: Presentación de Ruff Linter y Formatter + Tutorial de configuración
- Guía de migración de proyectos de Python desde Flake8 y Black hacia Ruff
pre-commit: herramienta de gestión de Git Hooks#
Como dice el refrán: «Si no tienes CI, al menos ten pre-commit» (bueno, eso lo digo yo).
pre-commit (sí, su letra p también es minúscula) es una herramienta de gestión de Git Hooks escrita en Python, aplicable a proyectos en diversos lenguajes de programación. Permite a los usuarios crear los Git Hooks necesarios según sus requerimientos.
Tomando como ejemplo el común «pre-commit hook», este se ejecutará automáticamente al realizar un git commit, ejecutando varias herramientas de verificación y formateo (es decir, los hooks que hayas configurado) para garantizar que el código enviado cumpla con los estándares.
Esto no solo mantiene la calidad del código, sino que también reduce las discusiones triviales en el code review, permitiendo a los revisores enfocarse en la lógica y la arquitectura.
En nuestro proyecto de ejemplo, pre-commit está configurado para ejecutar Ruff y algunas verificaciones básicas de formato, asegurando la coherencia del estilo de código.
Artículo relacionado: Desarrollo en Python: Tutorial de configuración de Git Hooks con pre-commit
Mypy: verificación estática de tipos#
¿Tu proyecto de Python cuenta con type hints?
Tal como mencionamos en el primer artículo de la serie, Django Ninja es un excelente punto de partida para aprender type hints.
Si deseas añadir type hints a tu proyecto, un verificador estático de tipos (static type checker) resulta indispensable; y entre las opciones disponibles, la elección más común es Mypy.
Mypy es una herramienta potente que no solo verifica errores de tipo, sino que también detecta muchos problemas potenciales antes de ejecutar el programa. Desde mi punto de vista, su impacto real trasciende el ámbito de los tipos.
Mypy es una herramienta imprescindible para proyectos grandes y trabajo en equipo. Sin embargo, quiero enfatizar que, incluso para proyectos pequeños, Mypy aporta beneficios evidentes.
Los costos y beneficios de las type hints se pueden ilustrar con la siguiente gráfica (recreada a partir de «Robust Python»):

A largo plazo, el uso de type hints y Mypy aporta beneficios sostenibles (lo cual aplica a todas las herramientas presentadas en este artículo 😎). Aunque al principio se requiere invertir algo de tiempo en aprender y adaptarse, vale la pena.
Para más explicaciones sobre Mypy y las type hints de Python, te invito a consultar mi serie «Trilogía de Mypy»:
- Notas sobre «Robust Python»: Cómo incorporar Type Hints de forma efectiva
- Type checker de Python: Introducción a Mypy
- Guía para añadir Mypy a un proyecto Django
Conclusión#
pyenv nos ayuda a gestionar flexiblemente las versiones de Python, Poetry resuelve los problemas de gestión de paquetes, mientras que herramientas como Ruff, pre-commit y Mypy garantizan un código limpio y coherente. Todas ellas se complementan para construir conjuntamente un entorno de desarrollo de alta eficiencia.
Aprovecharlas adecuadamente es una competencia fundamental para nosotros como desarrolladores modernos y un pilar clave en el trabajo en equipo. El aprendizaje requiere cierta inversión de tiempo, pero una vez adquirido el hábito, estoy seguro de que estas herramientas se convertirán en un impulso indispensable en tu proceso de desarrollo.