Doc test
1. Les docstrings
1.1 C’est quoi ?
Une docstring est une chaîne de caractères placée :
- au début d’un module (fichier),
- d’une fonction,
…et utilisée comme documentation intégrée (accessible via help() et .__doc__).
✅ Docstring = documentation + contrat d’usage + exemples.
1.2 Syntaxe
On utilise généralement des triples guillemets :
def aire_cercle(r):
"""Calcule l'aire d'un cercle de rayon r."""
return 3.14159 * r * r
Accès :
print(aire_cercle.__doc__)
help(aire_cercle)
1.3 Contenu conseillé
Une docstring utile contient souvent :
- Une phrase courte (ce que fait la fonction).
- Paramètres (type, signification).
- Retour (type, signification).
- Exceptions possibles.
- Exemples (souvent au format doctest).
Exemple simple mais propre :
def diviser(a, b):
"""
Divise a par b.
Args:
a (float): numérateur
b (float): dénominateur
Returns:
float: résultat de a / b
Raises:
ZeroDivisionError: si b == 0
"""
return a / b
Note : il existe plusieurs styles (Google, NumPy, reST/Sphinx). L’important est d’être cohérent dans un projet.
2. Les assert
2.1 À quoi ça sert ?
assert sert à détecter rapidement une condition qui devrait être vraie pendant le développement.
assert condition, "message si faux"
Si la condition est fausse → Python lève AssertionError.
2.2 Exemples
Vérifier des préconditions
def inverse(x):
assert x != 0, "x doit être >= 0"
return 1/x
Vérifier des invariants internes
def moyenne(notes):
assert len(notes) > 0
m = sum(notes) / len(notes)
assert 0 <= m <= 20
return m
2.3 Bonnes pratiques
Pour du “vrai” contrôle d’erreur en prod : lève des exceptions explicites :
def racine(x):
if x < 0:
raise ValueError("x doit être >= 0")
return x ** 0.5
3. doctest : tester via les docstrings
3.1 Le principe
doctest exécute des exemples écrits dans la docstring au format REPL (>>>) et vérifie que la sortie correspond.
Exemple :
def somme(a, b):
"""
Retourne a + b.
>>> somme(2, 3)
5
>>> somme(-1, 1)
0
"""
return a + b
3.2 Lancer doctest
if __name__ == "__main__":
import doctest
doctest.testmod()
3.3 Points importants (pièges fréquents)
A. Les flottants
Les flottants peuvent poser problème (arrondis). Préfère arrondir :
def ratio(a, b):
"""
>>> ratio(1, 3)
0.333333333333333333333333
"""
return a / b
B. Tester des exceptions
On peut vérifier qu’une exception est levée :
def inverser(x):
"""
>>> inverser(2)
0.5
>>> inverser(0)
Traceback (most recent call last):
...
ZeroDivisionError: division by zero
"""
return 1 / x
Les ... servent de joker pour des parties variables.
3.4 Quand utiliser doctest ?
✅ Excellent pour :
- des fonctions “pures” (entrées → sorties),
- documenter des exemples d’usage,
- éviter que la doc ne devienne fausse.
4. Trio gagnant : docstring + assert + doctest (exemple complet)
def factorielle(n):
"""
Calcule n! (factorielle) pour un entier n >= 0.
Args:
n (int): entier >= 0
Returns:
int: n!
Examples:
>>> factorielle(0)
1
>>> factorielle(5)
120
>>> factorielle(3)
6
"""
assert isinstance(n, int), "n doit être un int"
assert n >= 0, "n doit être >= 0"
res = 1
for k in range(2, n + 1):
res *= k
return res
if __name__ == "__main__":
import doctest
doctest.testmod()