Configuración y uso de ruff para análisis estático en Python

Clase 5 de 17Curso de Python Profesional: Arquitectura de Proyectos, Entornos y PyPI

Resumen

Mantén tu código profesional, consistente y sin sorpresas con análisis estático. Con ruff, un linter y formatter ultrarrápido escrito en Rust, puedes detectar bugs, problemas de estilo y hasta vulnerabilidades sin ejecutar el programa. Hoy, ruff reemplaza herramientas como PGLint y Flake ocho al combinar sus reglas y procesar miles de archivos en segundos.

¿Por qué usar ruff para análisis estático en Python?

Ruff permite detectar errores temprano y ahorrar tiempo. Integra revisión de estilo PEP 8, limpieza de imports y mejoras automáticas del código. Se configura en el archivo pyproject.toml, junto a otras herramientas como MyPy.

  • Es un formateador y un linter en uno solo.
  • Reemplaza PGLint y Flake ocho con reglas consolidadas.
  • Es ultrarrápido y apto para proyectos grandes.

¿Qué es un formatter y qué es un linter?

  • Un formatter (como ruff usado como formatter) “arregla” el estilo para cumplir PEP 8.
  • Un linter analiza el código fuente sin ejecutarlo para detectar errores de sintaxis, imports no usados y problemas potenciales.

Ejecuta cada uno así:

ruff format
ruff check

¿Cómo se configura ruff en pyproject.toml?

  • Define la configuración dentro de pyproject.toml.
  • Ajusta reglas según tu proyecto y, si quieres, agrúpalas con las de MyPy.
  • Mantén las reglas de lint juntas bajo la configuración de tool ruff para claridad.

¿Cómo ejecutar ruff, corregir y seleccionar reglas?

La práctica recomendada es correr ruff con frecuencia. Primero, inspecciona con check y, si hay errores arreglables, aplica fix.

ruff check
ruff check fix
  • Caso real: ruff reporta “diez errores”, de los cuales “ocho” son fixable. Con “check fix”, elimina imports no usados y aplica mejoras seguras. Quedan “dos errores” manuales, como variables definidas que nunca se usan.
  • Ruff evita borrar líneas que podrían cambiar el comportamiento; tú decides si eliminarlas.

¿Cómo activar rule selection e isort para ordenar imports?

Ruff permite ampliar la verificación con más reglas. Ejecuta todas para medir tu base de código:

ruff check select all
  • Ejemplo: aparecen “doscientos sesenta y seis” errores al activar más reglas. Esto muestra que ruff es altamente configurable y que, por defecto, usa un conjunto básico.
  • Desde la documentación, copia los “selects” recomendados: incluyen reglas de pycodestyles, pyflakes, pyupgrade y la “I” de isort para ordenar imports.
  • Tras configurar, usa “check fix” para que ruff elimine imports no usados y ordene los imports: primero los de Python, luego librerías externas y, al final, los locales. Separados por un enter, y dos enters antes del código.

¿Qué cambios automáticos y de estilo verás en el código?

  • Conversión de .format a literal string según la versión de Python: ruff sugiere el literal string por ser la práctica actual recomendada.
  • Límite de línea en 88 caracteres (PEP 8): divide donde sea seguro para mantener el código ejecutable. No partas expresiones críticas; busca el punto correcto para el salto.
  • Caso práctico: tras “catorce errores”, ruff arregla “siete” automáticamente. El resto requiere tu revisión.

¿Qué buenas prácticas fortalecen tu flujo con ruff?

Adoptar ruff desde el inicio eleva la calidad y agiliza revisiones. Integra su uso en tu ciclo de desarrollo.

  • Configúralo desde el inicio del proyecto para consistencia.
  • Ejecuta “run check” con regularidad, idealmente en cada commit. Con pre-commit podrás automatizarlo.
  • Combínalo con MyPy para tipos y PyTest para pruebas, logrando una suite completa de calidad de código.

¿Quieres que revisemos una configuración de pyproject.toml o mensajes de ruff que te estén costando? Comparte tu ejemplo y avanzamos juntos.