Assertions et préconditions

Dire ce qu'une fonction suppose et ce qu'elle garantit : précondition, postcondition, invariant, l'instruction assert et son échec, programmation défensive, et la différence avec le contrôle d'une saisie.

  • 26 cartes
  • 5 thèmes
  • Gratuit

Le programme, thème par thème

Le poids de chaque thème suit celui que lui donne l'examen.

  1. Notions
  2. Questions
  3. Ranger et relier
  4. Mises en situation
  5. Comprendre

Quelques cartes du deck

  • Précondition : de quoi s'agit-il ?

    Voir la réponse

    Condition qui doit être vraie au moment de l'appel d'une fonction pour qu'elle soit sûre de bien fonctionner.

    Elle engage l'appelant : si racine(n) suppose n >= 0, c'est à celui qui appelle de ne pas lui passer -4.

  • Qu'affiche ce programme ?

    ```python
    def racine(n):
    assert n >= 0, "n doit être positif ou nul"
    return n ** 0.5

    print(racine(9))
    print(racine(-4))
    print("fin")
    `

    • 3.0, puis AssertionError: n doit être positif ou nul, sans fin
    • 3.0, puis le calcul de (-4) ** 0.5 s'exécute, puis fin s'affiche
    • 3.0, n doit être positif ou nul, puis fin
    • 3.0, puis une ValueError levée sur la ligne du return
    Voir la réponse

    3.0, puis AssertionError: n doit être positif ou nul, sans fin

    assert lève AssertionError avec le message quand la condition est fausse, et rien ne s'exécute après : ni le return, ni print("fin"). L'arrêt se fait à la ligne de l'assertion, pas dans le calcul.

  • Une … doit être vraie avant l'appel, une … est garantie après.

    Voir la réponse

    Une précondition doit être vraie avant l'appel, une postcondition est garantie après.

    Les deux forment le contrat de la fonction : si l'appelant respecte la précondition, la fonction garantit la postcondition.

  • Postcondition : de quoi s'agit-il ?

    Voir la réponse

    Condition que la fonction garantit sur son résultat quand elle se termine, si ses préconditions étaient respectées.

    Elle engage la fonction : pour trier(t), le résultat contient les mêmes éléments que t, rangés en ordre croissant.

  • Un programme demande un âge à l'utilisateur et le passe à une fonction qui suppose age >= 0. Que faut-il faire de la saisie ?

    • La contrôler avec un if et redemander
    • Écrire assert age >= 0 et laisser le programme s'arrêter si l'utilisateur se trompe
    • Ne rien contrôler : la précondition de la fonction suffit à protéger le programme
    • Remplacer toute valeur négative par 0 sans prévenir
    Voir la réponse

    La contrôler avec un if et redemander

    Une saisie fautive est un cas prévu : on la traite avec un if et un message. L'assertion protège des erreurs de programmation, et Python peut l'ignorer avec l'option -O.