Bien écrire un programme
A- Documentation d’un programme : DocString.⚓︎
La DocString est une chaîne de caractères que l’on n’assigne pas.
Elle est placée juste en dessous de la signature de la fonction.
Exemple d’une docstring sur une seule ligne :
🐍 Script Python | |
---|---|
1 2 3 |
|
Écrire des DocStrings offrent de nombreux avantages :
- La fonction
help()
affiche cette documentation dans un interpréteur de commande (ici IDLE python).🐍 Script Python 1
help(ajouter)
Help on function ajouter in module __main__:
ajouter(a, b)
Ajoute deux nombres l'un à l'autre et retourne le résultat.
- Les outils de développement affichent cette documentation quand le programmeur écrit le nom de la fonction (fenêtre popup par exemple).
- On peut générer une bonne documentation du code avec des commandes qui extraient ces DocStrings.
- C’est un mécanisme standardisé de documentation : tout le monde sait que si c’est là, et que ça a cette forme, c’est une documentation.
- On peut mettre des tests dans les DocStrings, qui servent alors d’exemples d’utilisation.
Il existe plusieurs manières de formater une DocString, et il y a même un PEP 257 (Python Enhancement Proposals) qui ne parle que de ça.
Normaly a docstring must be wrote in English !... Any programmer speak English. This avoid the accented characters.
Des balises standards sont mises à disposition pour formater la documentation.
Exemple de DocString sur plusieurs lignes :
🐍 Script Python | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
|
Remarques :
- On remarque la DocString sur plusieurs lignes juste en dessous de la signature de la fonction. Elle contient notamment 2 exemples qui permettent de comprendre ce que renvoie la fonction et de tester son fonctionnement à l'aide du module DocTest.
doctest.testmod()
exécute les exemples de la partieExemples :
du DocString et vérifie le résultat.if not isinstance(x, (int, float)):
etif x < 0:
sont des pré-conditions qui permettent de s'assurer que les arguments passés à la fonction respectent bien le domaine de définition (x
doit être un nombre positif).from math import sqrt
importe la fonctionsqrt()
du modulemath
. C'est nécessaire pour pouvoir l'utiliser- Les instructions qui dépendent de la condition
if __name__ == '__main__':
ne sont exécutées que si le programme est exécuté en tant que programme principal. Ce qui ne sera pas le cas si on importe le fichier en tant que module depuis un autre fichier.
B- Tests unitaires. Utilisation des assertions⚓︎
Pour valider un projet informatique, on doit effectuer un bon nombre de tests. Une pratique de plus en plus exigée consiste à faire des tests automatiques pour chaque fonction.
On les appelle les tests unitaires.
Pour une organisation plus claire, on place l'écriture des fonctions dans un fichier (par exemple : math_functions.py
) et les fonctions de tests dans un autre (test_math_functions.py
). Par convention, le fichier de test commence par test_
suivi du nom du fichier contenant les fonctions à tester.
Exemple d'un fichier math_functions.py
🐍 Script Python | |
---|---|
1 2 3 4 5 6 7 8 |
|
Pour tester la fonction, on écrire le script dans le fichier test_math_functions.py
:
Fichier test_math_functions.py
🐍 Script Python | |
---|---|
1 2 3 4 5 6 7 |
|
Si les assertions sont validées, l’exécution du script ne renvoie rien.
Si on se trompe dans l'écriture de la fonction en écrivant par exemple cube_value = value * value
, alors on obtient :
Assertion Error
C- Exécution d’instructions localement au programme principal.⚓︎
Lorsqu'on écrit une fonction dans le fichier math_functions.py
, on teste son fonctionnement à l'aide d'instructions placées à la fin du fichier (généralement des print()
).
Pour autant, on ne veut pas que ces print()
soient exécutées lors de l’import du fichier dans test_math_functions.py
.
Pour cela on va conditionner leur exécution au fait que le fichier math_functions.py
soit exécuté en tant que programme principal.
Pour cela, on utilise la condition : if __name__ == "__main__" :
Exemple pour le fichier math_function.py
🐍 Script Python | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 |
|