Ruff: Un linter para Python con el poder de Rust.

CyberIngeniero
5 min readDec 18, 2023

--

Imagen creada con DALL·E 3

Si eres programador entonces muy probablemente sabrás lo que es un Linter, pero si no, pues te lo cuento!

Un Linter es una herramienta que te permite identificar y corregir errores comúnes de código de una manera simple, sin tener que ejecutar la aplicación. Estos se encuentran disponibles para la mayoría de los lenguajes de programación y su implementación a un proyecto suele ser sencilla.

Puesto que la mayoría de los proyectos de los cuales participo se basan en Python como lenguaje principal, es importante que utilice herramientas que me ayuden a mantener mi código limpio y ordenado.

En este artículo, voy a hablar de tres linters para Python que considero muy útiles: Flake8, Black y Ruff.

Flake8

Flake8 es un linter de código que se centra en encontrar errores de sintaxis, estilo y calidad. Está basado en PyFlakes y pycodestyle, y cuenta con una gran cantidad de plugins que permiten ampliar su funcionalidad

Se caracteriza principalmente por su flexibilidad y versatilidad a la hora se configurarlo y por verificar el cumplimiento de convenciones de estilo PEP 8.

Su instalación es muy sencilla

pip install flake8

y su uso aún más. Basta con indicar el archivo o el directorio que se desea validar.

flake8 path/to/code/to/check.py
# or
flake8 path/to/code/

Para automatizar el linting de tu código puedes personalizar las reglas de Flake8 utilizando un archivo de configuración .flake8 o setup.cfgen el directorio raíz de tu proyecto.

Black

Black, en estricto rigor, no es un linter, es un formateador de código para Python que busca garantizar un estilo de código consistente mediante la reformulación automática del código para cumplir con sus reglas de formato.

A diferencia de Flake8, Black se centra en la estandarización del estilo de tu código y no en la identificación de errores.

Black es determinista, lo que significa que siempre formateará el código de la misma manera, aplica un formato estándar predefinido, eliminando discusiones sobre estilos de código y logrando un aspecto uniforme en todo el proyecto.

Principales características

  • Aplica un estilo uniforme a todo el código.
  • Es muy rápido.
  • Es muy configurable.

Su instalación es simple

pip install black

Y del mismo modo que Flake8, Black se puede ejecutar sobre un archivo o directorio para formatear el código automáticamente

black path/to/code/to/check.py
# or
black path/to/code/

El detalle de la salida de Black muestra un breve resumen de las acciones que se han llevado a cabo.

$ black src/
error: cannot format src/black_primer/cli.py: Cannot parse: 5:6: mport asyncio
reformatted src/black_primer/lib.py
reformatted src/blackd/__init__.py
reformatted src/black/__init__.py
Oh no! 💥 💔 💥
3 files reformatted, 2 files left unchanged, 1 file failed to reformat.

Por defecto Black busca el archivopyproject.toml en el directorio raíz, en el cual se podrán definir multiples configuraciones y/o exclusiones de reglas a la hora de formatear tu código.

Ruff

Desde hace un tiempo que dejado atrás el uso de Flake8 y de Black, pues he descubierto Ruff que une lo mejor de ambos mundos.

Ruff es un linter y formateador de código que combina las características de Flake8 y Black. Es una herramienta muy potente que puede ayudarte a mantener tu código limpio, ordenado y de calidad.

Esta desarrollado en Rust, lo que hace que su principal atractivo sea su rápida velocidad y rendimiento en comparación a las herramientas revisadas anteriormente.

Características principales:

  • 10–100 veces más rápido que los linters (como Flake8) y formateadores (como Black) existentes.
  • Tiene soporte con archivos ️de configuración pyproject.toml
  • Compatibilidad con Python 3.12
  • Paridad directa con Flake8, isort y Black
  • Almacenamiento en caché integrado, para evitar volver a analizar archivos sin cambios.
  • Compatibilidad con Fix, para la corrección automática de errores (por ejemplo, eliminar automáticamente las importaciones no utilizadas).
  • Más de 700 reglas integradas, con reimplementaciones nativas de complementos populares de Flake8, como flake8-bugbear.

Ruff pretende ser órdenes de magnitud más rápido que las herramientas alternativas al tiempo que integra más funcionalidad detrás de una interfaz única y común.

Su instalación es igualmente simple

pip install ruff

y su uso sigue la misma línea de Flake8 y Black. Para verificar si existen errores en algún archivo se puede ejecutar ruff check .

❯ ruff check .
numbers/numbers.py:3:8: F401 [*] `os` imported but unused
Found 1 error.
[*] 1 fixable with the `--fix` option.

Y para corregir los errores existente se puede ejecutar ruff check --fix

$ ruff check --fix .
Found 1 error (1 fixed, 0 remaining).

Al igual que Black, Ruff tiene soporte con archivos de configuración pyproject.toml en donde se podrán establecer las distintas reglas a la hora de realizar el formateo del código como la exclusión de reglas que no deseamos considerar.

[project]
# Support Python 3.10+.
requires-python = ">=3.10"

[tool.ruff]
# Set the maximum line length to 79.
line-length = 79

[tool.ruff.lint]
# Add the `line-too-long` rule to the enforced rule set.
extend-select = ["E501"]

Conclusión

Flake8, Black y Ruff son tres linters para Python que pueden ayudarte a mantener tu código limpio, ordenado y de calidad. Cada uno tiene sus propias fortalezas y debilidades, por lo que es importante elegir el linter que mejor se adapte a tus necesidades.

Personalmente hoy uso Ruff, por su rapidez, versatilidad y porque es la combinación perfecta de las herramientas que desde siempre he usado. Tanto si se trata de un proyecto personal como de un esfuerzo de código abierto a gran escala, Ruff se erige como un aliado para mantener la calidad del código, elevar la legibilidad y detectar potenciales inconvenientes con gran facilidad.

Para profundizar en Ruff y su documentación, les invito a visitar su sitio web oficial. ¡Experimenten la potencia del linting rápido y eficaz para Python al probar Ruff!

CyberIngeniero @ 2023
Linkedin

--

--

CyberIngeniero
CyberIngeniero

Written by CyberIngeniero

ML Engineer | Modelling Team Leader at HDI | Master in Applied and Advanced Artificial Intelligence | Master Full Stack Web Development | MSc in Statistics