Les assertions disparaissent quand Python est lancé avec l'option -O
Exercice supplémentaire · niveau 2 · NSI (première), chapitre 3 — Langages et programmation · Tester autrement : doctest, assertions, mesures
Énoncé
Les assertions disparaissent quand Python est lancé avec l'option -O. Le constater, puis en tirer la règle : que peut-on mettre dans un assert, et que faut-il en tenir hors ?
Corrigé
L'expérience. Soit le fichier demo.py :
def moyenne(t):
assert len(t) > 0, "moyenne d'un tableau vide"
return sum(t) / len(t)
print("__debug__ vaut", __debug__)
print(moyenne([]))
Deux exécutions, deux comportements :
$ python3 demo.py
__debug__ vaut True
AssertionError: moyenne d'un tableau vide
$ python3 -O demo.py
__debug__ vaut False
ZeroDivisionError: division by zero
Avec -O, l'assertion n'est même pas compilée : l'erreur qui remonte n'est plus celle qu'on avait prévue, mais celle, brute, du calcul.
La règle. Un assert sert à documenter et à détecter une erreur de programmation — une précondition violée, un invariant rompu, une postcondition fausse. Il ne doit jamais porter la logique du programme :
- pas de validation d'une donnée venue de l'extérieur (saisie, fichier, réseau) : cela se fait par un
ifet un message, qui, eux, subsistent ; - aucun effet de bord dans l'expression testée. Écrire
assert enregistrer(x)ferait disparaître l'enregistrement avec l'option-O.
La formule à retenir : l'assertion dit « ceci ne peut pas arriver ». Si cela peut arriver — un utilisateur tape n'importe quoi, un fichier est absent — ce n'est pas une assertion, c'est un cas à traiter.
Les autres exercices de ce chapitre Le cours du chapitre
Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.