Adloun

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 :

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.