Quand utiliser les assert en python ?

Qu’est-ce qu’un assert ?

En Python un assert est une aide au débugage qui vérifie des conditions. Si la condition n’est pas vérifiée alors une AssertionError est soulevée avec, si besoin, un message d’erreur.

Par exemple, j’ai une fonction qui calcule la moyenne d’un élève avec en entrée une liste de ses notes scolaires :

def avg(notes):
     assert notes.length > 0, 'at least one note is required'
     return sum(notes) / len(notes)

Le but de l’assert dans cet exemple est de garantir que la liste de notes fournie en entrée contient au moins une note.

Maintenant si on teste cette fonction :

notes =[8, 9, 10]

print(avg(notes))

Tout va bien. En revanche si on teste avec une liste vide :

notes_empty =[]

print(avg(notes_empty))

Une AssertionError est soulevée parce que la condition sur la taille de la liste n’est pas vérifiée.

Cela permet d’identifier précisément la condition qui n’est pas respectée et ainsi faciliter le débugage.

Pourquoi ne pas utiliser de IF ?

Contrairement aux IFs, les assertions ne servent pas à signaler une erreur mais à stopper le programme dans le cas où ça arriverait. Avant qu’il ne soit trop tard. En d’autre termes, si une assertion est remontée, cela signifie que le programme doit être modifié. Il y a un bug.

Quand utiliser des assert ?

Les assertions ne font pas parti du code final livré. C’est pourquoi il est important de comprendre en quoi elle consiste. En supprimant toutes les instructions assert, le programme doit continuer à fonctionner normalement.

Le développeur peut les utiliser pour des fonctions internes pour lesquelles il n’y aura pas d’appels extérieurs. Si une fonction attend un paramètre externe, il est plus prudent de gérer l’erreur convenablement et proposer un traitement en conséquence via une structure IF. Le programme ne doit pas s’arrêter. Par exemple, si le programme attend une valeur positive et que l’utilisateur entre une valeur négative, le programme doit détecter le problème, informer l’utilisateur et l’inviter à recommencer.

En bref, les assertions servent à tester des conditions critiques qui ne devraient jamais arriver et faire stopper le programme si l’une d’entres-elles est déclenchée.

Une grande différence est que les asserts peuvent être désactivés (en compilant avec l’option -O) . De ce fait, ils constituent véritablement une aide pour le développer à identifier des bugs. Ni plus ni moins.

Donc il ne faut pas utiliser d’assert pour valider les données. Par exemple, les assert ne servent pas à vérifier les droits ou la disponibilité d’une ressource ou la validité de sa structure.

Bonus :

Quand on fourni un tuple comme argument à un assert, l’assertion est toujours validée et ce quel que soit le contenu du tuple !