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.