Aller au contenu principal

Python : Ruff

· 4 minutes de lecture

Ruff est un linter et formateur Python écrit en Rust, développé par Astral. Il réimplémente les règles de flake8 (et de nombreux plugins), isort, pyupgrade et une partie de pylint, ainsi qu'un formateur compatible avec black, avec des temps d'exécution de l'ordre de 10 à 100 fois inférieurs selon ses auteurs. Un seul outil et un seul fichier de configuration remplacent ainsi plusieurs dépendances de la chaîne de qualité du code.

Qu'est-ce que Ruff ?​

Ruff est un outil tout-en-un pour la qualité du code Python :

  • flake8 (linting)
  • black (formatting)
  • isort (import sorting)
  • pylint (linting avancé)

Le principal avantage : une performance exceptionnelle grâce à son implémentation en Rust.

Installation​

# Avec pip
pip install ruff

# Avec poetry
poetry add --group dev ruff

Configuration (pyproject.toml)​

[tool.ruff]
line-length = 88
target-version = "py310"

[tool.ruff.lint]
# Règles activées
select = [
"E", # pycodestyle errors
"W", # pycodestyle warnings
"F", # Pyflakes
"I", # isort (import sorting)
"N", # pep8-naming
"C4", # flake8-comprehensions
"UP", # pyupgrade
]

# Règles ignorées
ignore = [
"E501", # line-too-long (géré par formatter)
"W503", # line-break-before-binary-operator
]

[tool.ruff.format]
# Identique à black
quote-style = "double"
indent-style = "space"

Utilisation en ligne de commande​

# Vérifier les erreurs sans corriger
ruff check .
# Analyse le répertoire courant et affiche toutes les violations.

# Auto-corriger les erreurs détectables
ruff check --fix .
# Corrige automatiquement les problèmes qui peuvent l'être (imports, formatting, etc.).

# Formater le code
ruff format .
# Applique les conventions de formatting à tous les fichiers Python.

# Combiner vérification et formatting
ruff check --fix . && ruff format .
# Workflow complet : correction des erreurs puis formatting.

# Vérifier le formatting sans modifier
ruff format --check .
# Utile en CI/CD pour vérifier que le code est bien formaté.

Intégration VSCode​

Installation de l'extension​

  1. Ouvrir VSCode
  2. Extensions (Ctrl+Shift+X)
  3. Chercher "Ruff" (par Astral)
  4. Installer l'extension

Configuration VSCode (settings.json)​

{
"[python]": {
"editor.defaultFormatter": "charliermarsh.ruff",
"editor.formatOnSave": true,
"editor.codeActionsOnSave": {
"source.fixAll.ruff": "explicit",
"source.organizeImports.ruff": "explicit"
}
},
"ruff.importStrategy": "fromEnvironment",
"ruff.showNotifications": "onWarning"
}

Fonctionnalités​

  • Diagnostic en temps réel : Erreurs soulignées immédiatement dans l'éditeur
  • Auto-fix : Appui sur Ctrl+S pour formater et corriger le fichier
  • Hover info : Survoler une erreur pour accéder à la documentation
  • Command Palette : Ruff: Fix all auto-fixable problems

Pre-commit Hook​

Ajouter Ruff comme vérification automatique avant chaque commit :

# .pre-commit-config.yaml
repos:
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.5.0
hooks:
- id: ruff
args: [--fix]
- id: ruff-format

Installation du hook :

pre-commit install

Règles courantes​

CodeDescription
EPEP 8 errors
WPEP 8 warnings
FPyflakes (undefined names, unused imports)
IImport sorting
NNaming conventions
C4Comprehensions optimizations
UPModernize Python syntax
BBugbear (bugs courants)
DDocstring conventions

Workflow recommandé​

À chaque sauvegarde (VSCode)​

Format automatique et fix automatique grâce à la configuration VSCode.

Avant commit (pre-commit hook)​

ruff check --fix .
ruff format .

En CI/CD​

ruff check .           # Vérifier sans corriger
ruff format --check . # Vérifier le formatting

Exemple d'utilisation​

Soit le fichier main.py avec plusieurs problèmes :

import os
import sys
import json

def calculate(x,y):
result=x+y
return result

unused_var = 42

Après ruff check --fix . && ruff format . :

import json
import os
import sys

def calculate(x, y):
result = x + y
return result

Ruff a automatiquement :

  • Trié les imports (isort)
  • Ajouté les espaces autour des opérateurs (black)
  • Supprimé la variable non utilisée (avec --fix)

Application / Projet lié​

Mis en pratique dans le projetDécembre 2023 → aujourd'huiStandards Python - Template CookiecutterRuff configuré comme linter et formatter standard pour l'ensemble du projet Python.PythonuvRuffpytestCookiecutterGitHub Actions
Mis en pratique dans le projet2024 → aujourd'huiCI/CD - Workflows GitHub Actions mutualisésVérifications Ruff intégrées dans les pipelines CI/CD pour la qualité du code.GitHub ActionsDockerHelmPythonROSZephyr

Ressources​

Ruff représente une évolution majeure dans l'écosystème Python, combinant performance et simplicité. Son adoption améliore significativement la productivité des développeurs et la qualité du code.