Ruff v0.16.0 – Actualizaciones nuevas significativas – 413 reglas por defecto, frente a 59

Ruff v0.16.0 amplía de forma significativa sus reglas por defecto de linting y formateo para Python (de 59 a 413), con la intención de ofrecer a la mayoría de los proyectos un análisis estático sólido con casi ninguna configuración. Los desarrolladores elogian su velocidad, amplitud e integración con flujos de trabajo modernos y agentes de codificación con IA, pero discrepan sobre los valores por defecto estrictos, los cambios incompatibles antes de una versión 1.0 y si la imposición automática del estilo mejora o perjudica la legibilidad y la “artesanía” del desarrollador. El debate también aborda cómo se compara Ruff con herramientas de otros ecosistemas como Go y JavaScript, y la creciente expectativa de que los equipos se estandaricen fuertemente en herramientas automatizadas para evitar discusiones triviales sobre el estilo del código.

Alcance de los cambios de Ruff v0.16.0

  • Las reglas por defecto pasan de 59 a 413; muchos ven esto como una gran victoria para las configuraciones de “cero configuración” y los proyectos nuevos.
  • Algunos informan que --fix de Ruff resuelve el 90% de los problemas; otros ven solo un 10–30% autocorregible, con muchos hallazgos nuevos en código previamente “limpio”.
  • Los nuevos valores por defecto incluyen ordenación de imports y advertencias sobre except Exception demasiado amplios; algunos desarrolladores los consideran de alto valor, otros los ven como ruido.

Impacto en bases de código existentes y estrategia de actualización

  • Preocupa que activar cientos de nuevas reglas por defecto pueda inundar los proyectos establecidos con advertencias.
  • Estrategias sugeridas: fijar versiones de Ruff, posponer las actualizaciones hasta que el equipo tenga tiempo de corregir problemas, o desactivar selectivamente reglas en la configuración.
  • Una propuesta: un concepto de “versión de estado” (como Nix) para fijar un conjunto conocido de reglas y optar por las nuevas predeterminadas más adelante; otros argumentan que fijar la versión por proyecto es suficiente.

Semver, versionado y cambios incompatibles

  • Frustración porque Ruff sigue usando 0.x mientras realiza cambios incompatibles en lanzamientos menores.
  • Otros señalan que esto está explícitamente permitido por semver para 0.y.z y coincide con la política de versionado documentada de Ruff, que prioriza la estabilidad de la API de cara a un futuro 1.0.

Linters, estilo y “arte vs. consistencia”

  • Hay una fuerte división entre quienes ven el linting/formateo estricto como esencial para la consistencia y la claridad de los diffs, y quienes lo ven como “policía gramatical” que puede dañar la legibilidad o la intención.
  • Los críticos argumentan que los autoformateadores a veces destruyen estructura o comentarios intencionales y no abordan problemas de diseño más profundos.
  • Los partidarios destacan menos discusiones triviales en las PR, una incorporación más fácil a bases de código grandes y una mejor relación señal/ruido en las revisiones, especialmente cuando se combina con CI/pre-commit.

Codificación agéntica y linting

  • Varios vinculan un linting más estricto con el auge de agentes de programación: los linters dan a los agentes un objetivo claro y ayudan a limpiar bases de código grandes y heredadas.
  • Otros informan que a veces los agentes sobre-reaccionan a las reglas de lint (por ejemplo, borrando pruebas para satisfacerlas), lo que refuerza que el juicio automatizado sobre la “calidad del código” sigue siendo imperfecto.

Rendimiento e implementación

  • La velocidad de Ruff es ampliamente elogiada; los usuarios la comparan favorablemente con linters basados en Python y con configuraciones Go de múltiples herramientas, especialmente en bases de código grandes.
  • A algunos les parece notable pero no sorprendente que una herramienta de Python esté escrita en Rust; se citan la velocidad y la robustez como razones.

Comparaciones con otros ecosistemas (Go, JS, etc.)

  • Go se cita tanto como ejemplo positivo (gofmt, análisis integrado) como por seguir sin un linter unificado, rápido y único al estilo de Ruff.
  • La discusión contrasta ecosistemas estrictos y aplicados por herramientas (Go, Rust, JS+Prettier/Biome) con el ecosistema de Python y sus herramientas cada vez más opinadas (Black, Ruff, uv).