Un code qui marche n'est qu'un début. Un code de qualité est lisible, cohérent, maintenable. La communauté Python a établi des conventions (PEP 8) et des outils automatiques (Black, Flake8, Ruff, mypy) qui vous aident à écrire comme un professionnel. C'est un sujet qui compte au TOSA Expert — et qui change la vie en entreprise.
Pourquoi la qualité de code compte
Trois constats :
- On lit le code beaucoup plus souvent qu'on l'écrit. Vos collègues (et vous-même dans 6 mois) passeront plus de temps à le comprendre qu'à le taper.
- Un code propre a moins de bugs. La clarté révèle les erreurs ; l'obscurité les cache.
- Une cohérence globale dans une équipe réduit les frictions. Plus de guerres d'accolades.
La PEP 8 est le guide de style officiel. Les outils modernes l'appliquent automatiquement.
La PEP 8 en 10 règles
La PEP 8 est longue. Voici les règles que vous devez connaître par cœur.
1. Indentation : 4 espaces
# ✅
def f():
if condition:
action()Pas de tabulations. Configurez votre éditeur pour que Tab insère 4 espaces.
2. Longueur de ligne : 79 caractères max (ou 88 avec Black)
# ✅ Couper les longues lignes
resultat = fonction_avec_long_nom(
argument_1,
argument_2,
argument_3,
)La PEP 8 stricte dit 79. Black (voir plus bas) utilise 88 par défaut, considéré comme un compromis moderne.
3. Nommage
| Élément | Style | Exemple |
|---|---|---|
| Variable, fonction, méthode | snake_case |
ma_variable, calculer_moyenne() |
| Classe | PascalCase |
CompteBancaire |
| Constante | UPPER_SNAKE_CASE |
MAX_ESSAIS, PI |
| Privé (convention) | préfixe _ |
_solde, _methode_interne |
| Module/package | lowercase, court | mon_module, utils |
Trois formes d'underscores, à ne pas confondre :
_nom(un underscore devant) : la convention usuelle pour « privé ».__nom(deux devant seulement) : déclenche le name mangling — usage rare et avancé.__nom__(deux de chaque côté) : réservé à Python (__init__,__str__). N'en créez pas.
4. Espacement
# ✅ Autour des opérateurs
x = 1 + 2
y = a * b - c
# ✅ Après une virgule
def f(a, b, c):
...
# ❌ Pas d'espaces autour des = pour valeurs par défaut
def f(x=10): ... # ✅
def f(x = 10): ... # ❌
# ✅ Pas d'espace à l'intérieur des parenthèses
f(x, y) # ✅
f( x, y ) # ❌5. Lignes vides
# Deux lignes vides entre les fonctions/classes top-level
def fonction_1():
...
def fonction_2():
...
# Une ligne vide entre les méthodes d'une classe
class MaClasse:
def methode_1(self):
...
def methode_2(self):
...6. Imports
# ✅ Un import par ligne
import os
import sys
# ❌ À éviter
import os, sys
# Ordre des imports (séparés par des lignes vides) :
# 1. Bibliothèque standard
import os
from pathlib import Path
# 2. Bibliothèques tierces
import requests
import numpy as np
# 3. Modules locaux
from .utils import fonction7. Comparaisons
# ✅ Utilisez is avec None
if x is None:
...
# ❌
if x == None:
...
# ✅ Négation claire
if not x:
...
# ❌ Double négation
if not x != 10:
...8. Chaînes
Les guillemets simples et doubles sont équivalents. Choisissez-en un et tenez-vous-y. Black utilise "..." par défaut.
# Cohérence : tous simples ou tous doubles
nom = "Alice"
salutation = "Bonjour"
# Double si la chaîne contient un simple
citation = "Il a dit : 'salut'"9. Docstrings
Pour chaque module, classe, fonction publique, écrivez une docstring (vu chapitre 2 partie 2).
def calculer_moyenne(notes):
"""Calcule la moyenne d'une liste de notes.
Arguments:
notes: liste de nombres (int ou float).
Renvoie:
La moyenne arithmétique, ou 0 si la liste est vide.
"""
if not notes:
return 0
return sum(notes) / len(notes)10. Commentaires
- Expliquez le pourquoi, pas le comment (le code montre le comment).
- Un commentaire inexact est pire que pas de commentaire.
- Mettez les commentaires à jour quand vous modifiez le code.
# ❌ Inutile : le code dit exactement ça
x = x + 1 # on ajoute 1 à x
# ✅ Utile : explique le "pourquoi"
x = x + 1 # on compense l'offset de l'index 0-basedL'outil phare : Black, le formateur « sans compromis »
Black est un formateur de code automatique. Vous exécutez black mon_fichier.py, et votre code est reformaté selon des règles fixes et non négociables.
Installation
pip install blackUtilisation
# Formater un fichier
black mon_script.py
# Formater tout un dossier
black .
# Vérifier sans modifier
black --check .
# Voir les changements sans les appliquer
black --diff mon_script.pyAvant/après Black
Code mal formaté :
def calculer_total( prix, quantite ,tva = 0.20 ):
return prix*quantite*( 1+tva )
liste=[1 ,2,3, 4,5]Après black :
def calculer_total(prix, quantite, tva=0.20):
return prix * quantite * (1 + tva)
liste = [1, 2, 3, 4, 5]