Aller au contenu

Protéger son programme

Jusqu'à présent, nous avons considéré que l'utilisateur d'un programme était intelligent et respectait les préconditions indiquées dans le docstring... mais ce n'est pas toujours le cas.

Il est possible de renforcer cette précondition en la testant directement au début du code de la fonction.

Pour cela, on utilise l'instruction assert :

1
assert condition_à_respecter, "Message d'erreur sinon"

Cette instruction sera surtout utile pour tester le type des variables entrées en paramètres.

Exemple - Assertion sur les types

On considère à nouveau la fonction contient_e() étudiée dans les pages précédentes.

  1. Utilisez une assertion pour tester que le paramètre saisi est bien une chaîne de caractères.

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    def contient_e(mot):
        """
        mot – str
        Sortie: bool – True si mot contient 'e', False sinon
        """
    
        assert …………………………………………………………………………………………………………………………………………
        if 'e' in mot:
            return True
        else:
            return False
    
    Une solution
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    def contient_e(mot):
        """
        mot – str
        Sortie: bool – True si mot contient 'e', False sinon
        """
    
        assert isinstance(mot, str), f"Le paramètre {mot} doit être une chaîne de caractères."
        if 'e' in mot:
            return True
        else:
            return False
    
  2. Testez ensuite ce code dans la console :

    >>> contient_e('abcd')
    
    >>> contient_e(17)
    
    Une solution
    >>> contient_e('abcd')
    False
    
    >>> contient_e(17)
    ----> 7     assert isinstance(mot, str), f"Le paramètre {mot} doit être une chaîne de caractères."
    
    AssertionError: Le paramètre 17 doit être une chaîne de caractères.
    

Exemple - Assertion sur les valeurs

On considère la fonction racine_carree() qui doit renvoyer la racine carrée de la valeur (numérique) saisie en paramètre.

  1. Complétez l'assertion (les pointillés) de la fonction pour vérifier que le paramètre nb est un nombre positif ou nul.

    1
    2
    3
    4
    5
    6
    7
    def racine_carree(nb):
        """
        nb - float (ou int) positif ou nul
        Sortie : float (ou int), la racine carrée de nb
        """
        assert ..., "le paramètre nb doit être positif ou nul"
        return nb**0.5
    

    Une solution
    1
    2
    3
    4
    5
    6
    7
    def racine_carree(nb):
        """
        nb - float (ou int) positif ou nul
        Sortie : float (ou int), la racine carrée de nb
        """
        assert nb >= 0, "le paramètre nb doit être positif ou nul"
        return nb**0.5
    
  2. Testez cette fonction en choisissant plusieurs valeurs de nb, entières ou flottantes, positives ou négatives.

    Tests possibles

    Voici quelques exemples de tests :

    >>> racine_carree(6.25)
    2.5
    
    >>> racine_carree(-5)
    ----> 6     assert nb >= 0, "le paramètre nb doit être positif ou nul"
          7     return nb**0.5
    
    AssertionError: le paramètre nb doit être positif ou nul
    

Remarque

Il est possible de cumuler les conditions grâce aux opérateurs logiques and et or.

Exemple

1
2
3
4
5
6
7
def racine_carree(nb):
    """
    nb - float (ou int) positif ou nul
    Sortie : float (ou int), la racine carrée de nb
    """
    assert (isinstance(nb, int) or isinstance(nb, float)) and nb >= 0, "le paramètre nb doit être un nombre positif ou nul"
    return nb**0.5