Guide
Guide : Bien commenter son code
Un commentaire n'est pas là pour dire ce que fait le code. Le code le dit déjà. Il est là pour dire ce que le code ne peut pas dire .
Sommaire de la page
On apprend rarement à commenter, alors que c'est ce qui rend un code lisible… et ce que ton correcteur regardera. Ce guide rassemble toutes les règles. Chaque jour, le coin des commentaires de la fiche en travaille une.
| Jour | Le coin des commentaires |
|---|---|
| Lundi | Qu'est-ce qu'un bon commentaire ? L'intention, pas la traduction |
| Mardi | Un bon nom vaut mieux qu'un commentaire, et les docstrings |
| Mercredi | Commenter le pourquoi, et chasser les nombres magiques |
| Jeudi | Documenter ses classes et ses méthodes |
| Vendredi | Baliser les étapes d'une méthode longue |
| Samedi | Les commentaires qui mentent, et le code mort |
| Dimanche | La revue finale, et la checklist avant de rendre |
1. Ce que ton prof attend
Le cahier des charges du projet est très clair : un code avec un commentaire à chaque ligne n'est pas un code valable. Les commentaires servent à décrire l'intention d'une portion de code, pas à réécrire le programme en français.
Autrement dit, ton correcteur pénalise autant le trop que le pas assez.
2. Le test du lecteur
Pour chaque commentaire, pose-toi une seule question :
Si je supprime ce commentaire, est-ce que quelqu'un qui connaît Python perd une information ?
- Non → le commentaire est inutile : supprime-le.
- Oui → garde-le, et vérifie qu'il est clair et juste.
x += speed * dt # on ajoute speed fois dt à x
Ce commentaire ne survit pas au test : n'importe quel lecteur voit qu'on ajoute speed * dt à x.
x += speed * dt # speed est en pixels par seconde, dt en secondes
Celui-ci survit : les unités ne se voient pas dans le code.
3. Les trois outils, du plus fort au plus faible
3.1 D'abord, les noms
Le meilleur commentaire est celui dont on n'a pas besoin, parce que le code se lit tout seul.
❌
def f(a, b, t):
# calcule la position entre a et b
return a + (b - a) * t
v = 3 # vitesse de la voiture
✅
def lerp(start, end, t):
return start + (end - start) * t
car_speed = 3
Choisis des noms qui disent ce que c'est (frog, time_left, raft_under_frog) plutôt que des lettres ou des abréviations. Une fonction a un nom de verbe (create_cars, lose_life), une fonction qui répond à une question a un nom de question (is_jumping, is_on_screen).
3.2 Ensuite, les docstrings
Une docstring est un texte entre triples guillemets placé juste en dessous d'un def ou d'une class (ou tout en haut d'un fichier). Elle dit ce que fait la fonction ou ce que représente la classe, du point de vue de celui qui l'utilise.
def lane_positions(count: int, length: int) -> list:
"""Renvoie les positions x de count obstacles répartis sans chevauchement sur une voie."""
...
class Frog:
"""La grenouille du joueur, repérée en pixels et animée pendant ses sauts."""
À la différence d'un commentaire #, Python garde la docstring : ton éditeur l'affiche quand tu survoles la fonction, et help(lane_positions) l'affiche dans le terminal.
- Une phrase suffit la plupart du temps.
- Elle dit quoi, pas comment : « renvoie les positions », pas « fait une boucle sur count et tire un nombre au hasard ».
- Pas besoin de docstring pour une fonction évidente :
draw(self, screen)ouis_jumping(self)se passent d'explication.
3.3 Enfin, les commentaires #
Un commentaire # explique ce que ni les noms ni la docstring ne peuvent dire : pourquoi le code est écrit comme ça.
# Les règles suivantes ne s'appliquent qu'une fois la grenouille posée
if self.frog.is_jumping():
return
4. Quand un commentaire est utile
| Situation | Exemple |
|---|---|
| Le pourquoi d'un choix qui ne se voit pas | # On teste le centre : une grenouille ne tient pas sur un radeau du bout d'une patte |
| Une règle du jeu que le code applique | # Une maison déjà occupée fait perdre une vie, comme la haie |
| Une astuce ou une formule non évidente | # Nul au départ et à l'arrivée, maximal au milieu du saut |
| Les unités d'une valeur | JUMP_TIME = 0.15 # en secondes |
| L'intention d'un bloc dans une méthode longue | # Pointillés entre les voies de la route |
| Un piège que le prochain lecteur pourrait « corriger » à tort | # On décale aussi target_x, sinon la grenouille fait un bond en arrière au saut suivant |
| Le rôle d'un fichier (docstring de module) | """Sauvegarde et lecture du tableau des meilleurs scores.""" |
5. Quand un commentaire est nuisible
| Problème | Exemple | Que faire |
|---|---|---|
| Il répète le code | lives -= 1 # on enlève une vie | Supprimer. |
| Il compense un mauvais nom | t = 30 # temps restant | Renommer (time_left), puis supprimer. |
| Il est faux ou périmé | # vitesse de 2 au-dessus de speed = 3 | Corriger ou supprimer. Un commentaire faux est pire que pas de commentaire. |
| C'est du code mort | # self.y += self.v | Supprimer. Git (ou une copie) garde l'historique. |
| C'est une note de travail | # TODO, # test, # ça marche pas ??? | Traiter, puis supprimer avant de rendre. |
| Il remplace une constante | if y > 480: # hauteur de l'écran | Créer SCREEN_HEIGHT = 480, puis supprimer. |
| Il explique un code trop compliqué | Dix lignes de commentaire pour une méthode de 40 lignes | Découper en petites méthodes bien nommées. |
6. Le style
- Un dièse, une espace, puis une phrase :
# Les maisons sont régulièrement espacées. - Écris en français correct, avec une majuscule. Une seule langue pour tout le projet.
- Le commentaire d'un bloc se place au-dessus du bloc, au même niveau d'indentation.
- Le commentaire en fin de ligne est réservé aux courtes précisions (unités, valeur particulière) :
TIME_LIMIT = 30 # secondes par grenouille. - Reste court. Si un commentaire dépasse trois lignes, demande-toi si le code ne devrait pas être plus simple.
7. Un exemple complet, avant et après
❌ Avant : trop de commentaires, et pas les bons.
# fonction move
def move_obstacles(obstacles, dt):
# boucle sur les obstacles
for o in obstacles:
# on bouge
o[0] += o[3] * dt
# si plus grand que 624
if o[3] > 0 and o[0] > 624:
# on remet à gauche
o[0] = -o[2]
# sinon si
elif o[3] < 0 and o[0] + o[2] < 0:
o[0] = 624 # à droite
✅ Après : de bons noms, des constantes, et un seul commentaire qui dit pourquoi.
def update(self, dt: float) -> None:
self.x += self.speed * dt
# Un obstacle sorti d'un côté réapparaît de l'autre, entièrement caché
if self.speed > 0 and self.x > WIDTH:
self.x = -self.width
elif self.speed < 0 and self.x + self.width < 0:
self.x = WIDTH