C16.4 : Préconditions et postconditions d'une fonction

Vocabulaire

Préconditions

Les préconditions d'une fonction sont les critères que les paramètres de la fonction doivent vérifier.

Ces critères sont définis par le concepteur de la fonction. Ils doivent doivent être précisés dans la docstring de la fonction.

Parmi les préconditions, il y a les types des paramètres.

Postconditions

Les postconditions d'une fonctions sont les propriétés vérifiées à la fin de l'exécution de la fonction. Les postconditions correspondent principalement aux propriétés vérifiées par la valeur renvoyée par la fonction.

Les postconditions peuvent être précisés dans la docstring.

Parmi les postconditions, il y a le type de la valeur renvoyée.

Un peu de Python...

La fonction isinstance

La fonction isinstance permet de tester le type d'une variable.

Tester les instructions suivantes en ligne de commande :

a = 5
isinstance(a,float)
isinstance(a,int)
isinstance(a,str)

b = '18'
isinstance(b, str)
isinstance(b, int)

isinstance([1,2,3], list)
isinstance((1,2,3), tuple)
isinstance({1:1,2:2,3:3}, dict)

Les assertions

1) Définition

En informatique, une assertion est une condition qui doit être vraie pour que l'exécution du programme se poursuive. Dans le cas contraire, le programme est arrêté et renvoie une erreur de type AssertionError.

Les assertions sont principalement utilisées pour s'assurer que les préconditions sont bien respectées.

2) Syntaxe en python

En Python, on utilise l’instruction assert

assert condition, 'Texte (facultatif) affiché lorsque le programme est interrompu'

Si condition est évalué à False, le programme est interrompu avec une erreur de type AssertionError et le texte est envoyé pour affichage dans la ligne de commande.

Si condition est évalué à True, le programme se poursuit normalement.

3) Exemple

b = 5
assert b == 8, "La variable b n'est pas égale à 8"
print("Le programme se poursuit")

Dans cet exemple, la ligne 3 n'est pas exécutée. En effet le programme est interrompu à la ligne 2 car l'affirmation b == 8 n'est pas vérifiée.

Applications

Application n° 1 (sur papier)

On s'intéresse à la fonction ci-dessous :

def myst(l):
    assert l !=[], "La liste ne doit être vide..."
    m = l[0]
    for i in range(1, len(l)):
        if l[i] < m:
            m = l[i]
    return m

1. Expliquer le rôle de cette fonction (lignes 3 à 7).

2. Préciser le rôle de la ligne 2.

3. Ajouter une assertion en tout début de fonction pour tester que le paramètre est bien une liste.

4. Ajouter une docstring à cette fonction.

Application n° 2

Écrire une fonction qui prend un entier strictement positif en paramètre et renvoie la somme des nombres de 0 à l'entier passé en paramètre. On intégrera deux assertions en début de fonction : l'une pour tester que le paramètre est bien un entier, l'autre pour tester qu'il est bien strictement positif.

Application n° 3

1) Écrire une fonction est_liste_entiers(liste:list) -> bool qui prend une liste en paramètre et renvoie True si tous les éléments de la liste sont des entiers et False dans le cas contraire.

2) On souhaite écrire une fonction qui prend en paramètre une liste contenant uniquement des nombres entiers.

Écrire les assertions qui permettent de vérifier les préconditions de cette fonction. On pourra utiliser la fonction écrite précédemment.