Introducción
Si llevas tiempo programando en Python, seguramente tu entorno de desarrollo incluya una combinación de herramientas: Flake8 para buscar errores, Black para formatear el código, isort para ordenar los imports, y quizás Pylint para un análisis más profundo.
Configurar, mantener y ejecutar todas estas herramientas por separado puede ser tedioso y, sobre todo, lento. En proyectos grandes, el linting puede tardar segundos o incluso minutos, rompiendo tu ritmo de trabajo.
¿Y si te dijera que existe una herramienta capaz de reemplazar a casi todas ellas, ofreciendo los mismos resultados, pero ejecutándose entre 10 y 100 veces más rápido? Esa herramienta es Ruff.
¿Qué es Ruff?
Ruff es un linter y formateador de código para Python escrito en Rust. Ha sido creado por Astral, el mismo equipo que recientemente lanzó uv (el gestor de paquetes del que hablamos en otro artículo).
Ruff no es solo "otro linter". Su objetivo es ser una navaja suiza que unifica la funcionalidad de docenas de herramientas populares en un solo binario estático de altísimo rendimiento.
Ruff es capaz de reemplazar (y emular casi a la perfección) a:
- Flake8 (y docenas de sus plugins más populares como
flake8-bugbear). - Black (el formateador de código por excelencia).
- isort (para ordenar imports).
- pydocstyle (para docstrings).
- pyupgrade (para modernizar sintaxis de Python).
- autoflake (para eliminar imports no usados).
Grandes proyectos open-source como FastAPI, Pandas, SciPy y Apache Airflow ya han migrado a Ruff.
Ventajas: ¿Por qué deberías usar Ruff?
La adopción de Ruff ha sido muy extendida en la comunidad de Python, y estas son las razones principales:
-
Velocidad Absurda: Ruff es increíblemente rápido. Al estar escrito en Rust y diseñado desde cero para el rendimiento, es entre 10 y 100 veces más rápido que la combinación de Flake8 y Black. Puedes lintar y formatear bases de código gigantescas en milisegundos. Es tan rápido que puedes ejecutarlo al guardar el archivo (on-save) sin notar ningún retraso.
-
Herramienta Todo-en-Uno: Olvídate de tener un archivo
.flake8, otro paraisort, y configuración deblackenpyproject.toml. Ruff unifica todo. Tienes un solo comando para lintar, formatear y ordenar imports, y una sola configuración centralizada. -
Compatibilidad "Drop-in": Ruff se ha esforzado mucho en ser compatible con las herramientas que reemplaza. Su formateador está diseñado para producir una salida casi idéntica a la de Black. Sus reglas de linting son reimplementaciones fieles de las de Flake8. Puedes migrar hoy mismo y apenas notarás la diferencia en el código, solo en la velocidad.
-
Capacidad de Auto-fix (Corrección Automática): Ruff no solo te dice qué está mal, sino que puede arreglarlo por ti. Con el flag
--fix, Ruff puede eliminar imports no usados, añadir variables faltantes en__all__, reescribir sintaxis antigua (ej. convertirSet()a{}), y mucho más, de forma segura y automática. -
Soporte Moderno: Soporta las últimas versiones de Python (incluyendo 3.12 y 3.13) y se integra perfectamente con
pyproject.tomldesde el primer día.
Contras (Desventajas)
Aunque Ruff es excelente, vale la pena mencionar algunos puntos:
- No es un analizador estático profundo (aún): Herramientas como Pylint o MyPy realizan un análisis mucho más profundo del flujo de tipos y datos. Ruff se centra más en el estilo y errores sintácticos o lógicos locales. Por eso, lo ideal es usar Ruff + MyPy.
- Reglas personalizadas: Si tienes plugins de Flake8 hechos a medida en tu empresa, es posible que Ruff aún no los tenga implementados (aunque tiene más de 800 reglas integradas).
Comparación con otros sistemas
| Característica | Ruff | Flake8 + Black + isort | Pylint |
|---|---|---|---|
| Velocidad | ⚡️⚡️⚡️ (Instántaneo) | 🐢 (Lento) | 🐢🐢 (Muy Lento) |
| Lenguaje | Rust | Python | Python |
| Formateo | ✅ (Incluido) | ✅ (Requiere Black) | ❌ |
| Ordenar Imports | ✅ (Incluido) | ✅ (Requiere isort) | ❌ |
| Configuración | Única (pyproject.toml) | Múltiple | Única |
| Auto-fix | ✅ (Muy potente) | ❌ (Limitado) | ❌ |
Ruff vs. Flake8/Black: No hay competencia. Ruff hace lo mismo, mucho más rápido y con menos configuración. Es la recomendación por defecto hoy en día.
Ruff vs. Pylint: Son complementarios. Pylint puede encontrar errores lógicos complejos que Ruff no busca. Sin embargo, Pylint es muy lento. Muchos desarrolladores usan Ruff para el feedback inmediato y dejan Pylint (o MyPy) para el CI/CD.
Cómo usar Ruff: Guía Rápida
1. Instalación
Puedes instalar Ruff como cualquier otro paquete de Python.
# Con pip
pip install ruff
# Con uv (¡la combinación perfecta!)
uv add --dev ruff2. Uso Básico
Ruff tiene dos comandos principales que usarás constantemente: check (para linting) y format (para formateo).
# 1. Buscar errores (Linting)
ruff check .
# 2. Corregir errores automáticamente (¡Magia!)
ruff check --fix .
# 3. Formatear el código (Reemplazo de Black)
ruff format .Configuración Recomendada
Ruff funciona muy bien "out of the box", pero puedes personalizarlo en tu pyproject.toml. Aquí tienes una configuración inicial recomendada:
[tool.ruff]
# Longitud de línea (igual que Black)
line-length = 88
[tool.ruff.lint]
# Activar reglas:
# E: pycodestyle errors
# F: Pyflakes
# I: isort (ordenar imports)
# B: flake8-bugbear (bugs comunes)
# UP: pyupgrade (modernizar sintaxis)
select = ["E", "F", "I", "B", "UP"]
# Ignorar reglas específicas si es necesario
ignore = []Conclusión
Ruff ha cambiado las reglas del juego. La mejora en velocidad es tan drástica que cambia la forma en que interactúas con tu código. Ya no tienes que esperar a ver si el CI falla; tienes feedback instantáneo mientras escribes.
Si estás empezando un proyecto nuevo, usar Ruff es una decisión obvia. Si tienes un proyecto existente, la migración es sencilla y los beneficios inmediatos. Simplifica tu entorno de desarrollo, elimina dependencias y gana tiempo con Ruff.