Python : Ruff
Ruff est un linter et formatter Python ultra-rapide écrit en Rust. Il remplace plusieurs outils comme flake8, black, isort et pylint en étant 10 à 100 fois plus rapide. Cet outil simplifie considérablement la chaîne de qualité du code Python.
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é
standards-python
Utilisation : Ruff configuré comme linter et formatter standard pour l'ensemble du projet Python.
CI/CD
Utilisation : Vérifications Ruff intégrées dans les pipelines CI/CD pour la qualité du code.
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.