Python : Ruff
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
- Ouvrir VSCode
- Extensions (Ctrl+Shift+X)
- Chercher "Ruff" (par Astral)
- 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
| Code | Description |
|---|---|
| E | PEP 8 errors |
| W | PEP 8 warnings |
| F | Pyflakes (undefined names, unused imports) |
| I | Import sorting |
| N | Naming conventions |
| C4 | Comprehensions optimizations |
| UP | Modernize Python syntax |
| B | Bugbear (bugs courants) |
| D | Docstring 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é
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.