đź“– Manuel
Python Best Practices
Workflow
- Structure du projet : Adopter le src layout (
src/mon_package/), configurerpyproject.tomlcomme source unique de vérité, gérer les environnements virtuels avecpoetryouuv(plus rapide), définir les dépendances avec groupes dev/prod, versionner le package avec__version__centralisé.
- Style et conventions : Appliquer PEP 8 via
ruff(lint + format), utiliser les type hints PEP 484 sur toutes les signatures publiques, rédiger des docstrings au format Google ou NumPy, configurerblackouruff formatpour le formatage automatique, définir les règles danspyproject.tomlsection[tool.ruff].
- Patterns pythoniques : Préférer les list/dict/set comprehensions aux boucles impératives, utiliser les générateurs (
yield) pour les séquences paresseuses, exploiter les context managers (with,__enter__/__exit__,contextlib), maîtriser les décorateurs (functools.wraps, stacking), remplacer les classes de données simples par@dataclassouattrs.
- Async Python : Structurer avec
asyncio(event loop,async def,await), utiliseraiohttpouhttpxpour les requêtes HTTP asynchrones, implémenter des async generators (async for), appliquer la structured concurrency avecasyncio.TaskGroup(Python 3.11+), éviter les blocages en ne mixant pas sync/async sansrun_in_executor.
- Testing : Organiser les tests avec
pytestet le dossiertests/, utiliser les fixtures pour l'injection de dépendances,@pytest.mark.parametrizepour les cas multiples,unittest.mockoupytest-mockpour le mocking, mesurer la couverture avecpytest-cov, utiliserhypothesispour le property-based testing.
- Performance : Profiler avec
cProfileetline_profileravant d'optimiser, utiliserfunctools.lru_cache/functools.cachepour la mémoïsation, paralléliser les tâches CPU avecmultiprocessing, les tâches I/O avecasyncio, envisagerCythonounumbapour les hot paths, optimiser la mémoire avec__slots__et les générateurs.
- Packaging et distribution : Configurer
pyproject.tomlavec[build-system],[project],[project.optional-dependencies], construire avecpython -m build, publier sur PyPI viatwineoupoetry publish, gérer le versioning sémantique avecbump2versionoucommitizen, créer des scripts d'entrée avec[project.scripts].
- Outils essentiels : Automatiser avec
ruff(lint+format), vérifier les types avecmypyen mode strict, configurerpre-commithooks (ruff, mypy, tests), utilisertoxpour tester sur plusieurs versions Python, structurer les commandes dans unMakefile, intégrer dans CI/CD (GitHub Actions,.github/workflows/ci.yml).
Règles
- Écrire du code pythonique : explicite > implicite, lisibilité > concision excessive, suivre le Zen of Python (
import this). - Typer systématiquement le code public avec les type hints et valider avec
mypy --strict; les types sont de la documentation executable. - Ne jamais ignorer les exceptions silencieusement (
except Exception: pass) ; logger ou re-raise avec contexte (raise ValueError("msg") from e). - Utiliser les outils de l'écosystème moderne :
uvpour la vitesse,ruffremplaceflake8+isort+pylint,httpxremplacerequestspour l'async. - Expliquer le "pourquoi" dans les commentaires, pas le "quoi" ; le code doit s'auto-documenter via des noms explicites et des type hints précis.