Écosystème et outils¶
Un bon environnement de développement Python combine un éditeur configuré, des outils d'analyse statique, un système de gestion de versions Python et des outils de profiling. Cette section présente les choix les plus courants en 2025, avec un accent particulier sur ruff qui s'est impose comme l'outil de linting et formatage dominant.
IDE et éditeurs¶
VS Code¶
VS Code est l'éditeur le plus utilisé pour Python en 2025. Les extensions indispensables :
| Extension | Éditeur | Rôle |
|---|---|---|
| Python | Microsoft | Support de base, IntelliSense, venv, debugger |
| Pylance | Microsoft | Type checking en temps réel, completions avancees |
| Ruff | Astral | Linting et formatage en temps réel |
| Python Test Explorer | Little Fox | Interface graphique pour pytest |
| Even Better TOML | tamasfe | Syntaxe pyproject.toml |
Configuration VS Code recommandee¶
// .vscode/settings.json
{
// Interpreteur Python
"python.defaultInterpreterPath": "${workspaceFolder}/.venv/bin/python",
// Formatage automatique a la sauvegarde
"editor.formatOnSave": true,
"[python]": {
"editor.defaultFormatter": "charliermarsh.ruff",
"editor.codeActionsOnSave": {
"source.fixAll.ruff": "explicit",
"source.organizeImports.ruff": "explicit"
}
},
// Desactiver les autres linters si ruff est utilise
"pylint.enabled": false,
"flake8.enabled": false,
"autopep8.enabled": false,
// Tests
"python.testing.pytestEnabled": true,
"python.testing.pytestArgs": ["tests"],
// Type checking via Pylance
"python.analysis.typeCheckingMode": "basic"
}
PyCharm¶
PyCharm (JetBrains) est l'IDE specialise Python le plus complet, avec refactoring avance, support Django intégré et profiler visuel. La version Community est gratuite et couvre la plupart des besoins.
Fonctionnalités differenciantes par rapport à VS Code :
- Refactoring semantique (renommage, extraction de méthode)
- Profiler intégré avec visualisation flame graph
- Inspections de code plus profondes
- Support de bases de données intégré
Linting et formatage — ruff¶
ruff est un linter et formateur Python écrit en Rust. Il remplacé en une seule commande : flake8, isort, pyupgrade, black et une partie de pylint. Il est 10 a 100x plus rapide que ses équivalents Python.
Installation et configuration¶
# pyproject.toml
[tool.ruff]
target-version = "py312"
line-length = 88
[tool.ruff.lint]
select = [
"E", # pycodestyle errors
"W", # pycodestyle warnings
"F", # pyflakes
"I", # isort
"B", # flake8-bugbear
"UP", # pyupgrade
"SIM", # flake8-simplify
"TCH", # flake8-type-checking
"RUF", # ruff-specific rules
]
ignore = [
"E501", # Longueur de ligne (geree par le formateur)
"B008", # Ne pas appeler de fonctions dans les valeurs par defaut
]
[tool.ruff.lint.isort]
known-first-party = ["monpaquet"]
[tool.ruff.format]
quote-style = "double"
indent-style = "space"
# Commandes essentielles ruff
ruff check . # Linting de tout le projet
ruff check . --fix # Correction automatique
ruff format . # Formatage
ruff format . --check # Verifier sans modifier (CI)
ruff check . --select I --fix # Trier les imports uniquement
Vérification de types — mypy et pyright¶
mypy¶
mypy est le verificateur de types de référence pour Python. Il analyse les annotations de type et détecté les incoherences statiquement.
# pyproject.toml
[tool.mypy]
python_version = "3.12"
strict = true # Active toutes les verifications strictes
ignore_missing_imports = true # Ignore les librairies sans stubs
plugins = ["pydantic.mypy"] # Plugin Pydantic pour une meilleure inference
# Verification du projet complet
mypy .
# Verification d'un fichier specifique
mypy main.py --show-error-codes
Exemple d'erreur mypy :
def additionner(a: int, b: int) -> int:
return a + b
resultat = additionner(1, "deux")
# error: Argument 2 to "additionner" has incompatible type "str"; expected "int"
pyright / pylance¶
Pyright (Microsoft) est plus rapide que mypy et alimente Pylance dans VS Code. Pour les projets FastAPI/Pydantic, il offre une meilleure inference des modèles.
Commencer par --basic avant --strict
Sur un projet existant, activez typeCheckingMode = "basic" dans VS Code et warn_return_any = true dans mypy avant de passer en mode strict. La migration progressive est plus tenable que tout corriger d'un coup.
Debuggers¶
pdb — Debugger en ligne de commande¶
# Insertion d'un point d'arret dans le code (Python 3.7+)
breakpoint() # Equivalent a import pdb; pdb.set_trace()
# Commandes pdb essentielles
# n : prochaine ligne (next)
# s : entrer dans la fonction (step)
# c : continuer jusqu'au prochain breakpoint (continue)
# p x : afficher la valeur de x (print)
# l : afficher le code autour de la ligne courante (list)
# q : quitter (quit)
debugpy — Debugger VS Code¶
debugpy est l'adapteur DAP (Debug Adapter Protocol) utilisé par VS Code pour le debugging Python.
// .vscode/launch.json
{
"version": "0.2.0",
"configurations": [
{
"name": "FastAPI (uvicorn)",
"type": "python",
"request": "launch",
"module": "uvicorn",
"args": ["main:app", "--reload"],
"jinja": true,
"justMyCode": true
},
{
"name": "pytest",
"type": "python",
"request": "launch",
"module": "pytest",
"args": ["tests/", "-v"],
"justMyCode": false
}
]
}
Profiling¶
cProfile — Profiler intégré¶
import cProfile
import pstats
from io import StringIO
def profiler_fonction(func, *args, **kwargs):
"""Execute une fonction sous cProfile et affiche les resultats."""
profiler = cProfile.Profile()
profiler.enable()
result = func(*args, **kwargs)
profiler.disable()
flux = StringIO()
stats = pstats.Stats(profiler, stream=flux)
stats.sort_stats("cumulative")
stats.print_stats(20) # Top 20 fonctions
print(flux.getvalue())
return result
# Depuis la ligne de commande
# python -m cProfile -s cumulative main.py
py-spy — Profiler sans modification du code¶
py-spy peut se brancher sur un processus Python en cours d'exécution, sans modifier le code source ni redémarrer l'application.
# Installation
pip install py-spy
# Profiler en temps reel (necessite sudo ou les droits)
py-spy top --pid <PID>
# Generer un flamegraph SVG
py-spy record -o profil.svg -- python main.py
# Profiler un serveur uvicorn en cours
py-spy record -o profil.svg --pid <PID_UVICORN>
scalene — Profiler mémoire et CPU¶
scalene mesure simultanément la consommation CPU et mémoire, ligne par ligne, en distinguant le code Python du code natif (numpy, etc.).
Gestion des versions Python — pyenv et mise¶
pyenv¶
# Installation (Linux/macOS)
curl https://pyenv.run | bash
# Lister les versions disponibles
pyenv install --list | grep "3.12"
# Installer une version
pyenv install 3.12.7
pyenv install 3.13.0
# Definir la version globale
pyenv global 3.12.7
# Definir la version locale du projet (cree .python-version)
pyenv local 3.13.0
# Verifier
python --version # Python 3.13.0
mise (anciennement rtx)¶
mise est un gestionnaire de versions polyvalent (Python, Node.js, Go, Rust...) plus rapide que pyenv.
# Installation
curl https://mise.run | sh
# Ajouter Python
mise use python@3.12
mise use python@3.13
# Dans un projet (cree .mise.toml)
mise use --path python@3.12.7
# Configuration globale
cat ~/.config/mise/config.toml
Résumé des outils recommandes en 2025¶
| Catégorie | Outil recommande | Alternative |
|---|---|---|
| Gestionnaire paquets | uv | poetry |
| Linter/formateur | ruff | black + flake8 |
| Type checking | mypy (strict) | pyright |
| Tests | pytest | unittest |
| Couverture | pytest-cov | coverage.py |
| Debugger | debugpy (VS Code) | pdb |
| Profiler | py-spy | cProfile, scalene |
| Versions Python | pyenv | mise |
| IDE | VS Code + Pylance | PyCharm Community |
Stack minimale pour un nouveau projet
Pour démarrer rapidement : uv init mon-projet && cd mon-projet && uv add --dev ruff mypy pytest pytest-cov. Vous avez l'essentiel en moins d'une minute.