C7.2 : Assertions

Travail préliminaire (sur papier)

■ Préconditions et postconditions

Question : Rappeler ce que sont les préconditions et les postconditions d'une fonction.

■ Application

On considère le code suivant :

def f(t):
    a = 0
    for i in range(len(t)):
        if t[i] > t[a]:
            a = i
    return a

1) Que vaut f([0, 9, 4]) ?

2) Améliorer la lisibilité du code de cette fonction en choisissant des noms parlants, en ajoutant des annotations de type et une docstring complète pour la fonction.

3) Que renvoie la fonction :

Préciser les préconditions pour la fonction.

Les assertions en python

■ 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é.

Les assertions sont en général utilisées dans les fonctions pour s'assurer que les préconditions sont bien respectées.

■ Les assertions en python

En Python, on utilise l’instruction assert

assert condition, 'Texte (facultatif) affiché lorsque le programme est interrompu si la condition n\'est pas respectée'

Si la condition n'est pas respectée, le programme est interrompu avec une erreur de type AssertionError et le texte est envoyé pour affichage dans la ligne de commande.

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.

■ Rappel sur la fonction isinstance

L'instruction isinstance(var, type) permet de tester le type d'une variable.
Exemple :

>>>isinstance(8, int)
True

Applications

Application III_app1

Reprendre le code de la fonction du I) en y ajoutant une assertion pour assurer que la liste passée en paramètre n'est pas vide.

Application III_app2

1) Proposer quelques lignes de code avec une assertion permettant d'assurer qu'une liste contient uniquement des entiers.

2) Compléter le code précédant pour assurer qu'une liste contient uniquement des entiers positifs ou nuls.

Application III_app3

On considère la fonction dont le début du code est donné ci-dessous :

from random import randint
def liste_uniques(N, d, f):
    """
    Renvoie une liste de N nombres entiers aléatoires entre d et f (compris) sans aucun doublon.
    """

1) Lister toutes les préconditions sur les paramètres de cette fonction.

2) Compléter le code de la fonction.

3) Ajouter des assertions au code de la fonction afin que le programme soit interrompu si les préconditions ne sont pas respectées.