Fiche de révision

Modules et documentations

 

Que l'on distribue du code ou que l'on utilise l'offre pléthorique de modules Python, la manipulation des modules et de la documentation fait partie intégrante du développement logiciel.

IProgrammation modulaire

1 Principes généraux

Le principe de modularité est particulièrement important dans tout développement logiciel. Il simplifie les tests, permet de réutiliser du code, et facilite la maintenance. Ce principe peut opérer à plusieurs niveaux :

découper le code en fonctions ;

grouper les fonctions dans une classe (on les appelle alors méthodes) ;

grouper des fonctions par thèmes, dans un fichier séparé ;

grouper des fichiers en bibliothèques.

La programmation modulaire intervient :

lors de l'écriture de portions de code pour les réutiliser plus tard, ou les distribuer ;

lors de l'utilisation, pour répondre à un besoin, de code écrit par un∙e autre.

2 Modularité en Python

On peut (on doit…) écrire des fonctions et des procédures, et les réutiliser.

Python permet de faire de la programmation orientée objets et donc de grouper des fonctions (alors appelées méthodes) au sein de classes, selon le type d'objet sur lequel elles agissent.

Fonctions, procédures et classes peuvent être groupées par thèmes dans des fichiers séparés alors appelé modules qui peuvent être groupés en packages.

IIImportation des modules

Certains modules Python sont installés par défaut (bibliothèque standard) et d'autres peuvent être ajoutés en utilisant des outils comme pip. Le dépôt Pypi (Python Package Index, https://pypi.org/) référence la plupart des modules tiers.

Pour importer un module installé, on utilise le mot clé import dans une de ses variantes. Voici des exemples avec le module random :

On importe le module random, les fonctions du module doivent être préfixées du nom du module :

Tableau de 2 lignes, 2 colonnes ;Corps du tableau de 2 lignes ;Ligne 1 : ; import random; Ligne 2 : ; a = random.randint(1, 10);

On importe le module random et on le renomme en rnd (le nouveau nom donné est généralement plus court) :

Tableau de 2 lignes, 2 colonnes ;Corps du tableau de 2 lignes ;Ligne 1 : ; import random as rnd; Ligne 2 : ; a = rnd.randint(1, 10);

On importe uniquement la fonction randint du module random (plus de préfixe, mais seule la fonction randint est disponible) :

Tableau de 2 lignes, 2 colonnes ;Corps du tableau de 2 lignes ;Ligne 1 : ; from random import randint; Ligne 2 : ; a = randint(1, 10);

Toutes les variantes contenant des * dans la ligne d'importation visent à rendre disponibles des fonctions sans avoir à les préfixer, ce qui peut paraître efficace pour le programmeur débutant. En réalité, il n'en est rien : on ne maîtrise plus la liste exacte de ce qui est importé dans l'espace de noms principal, ce qui peut être source de bugs complexes à découvrir. De plus, en reprenant plus tard son travail ou en le distribuant, on n'aura plus de trace simple de l'endroit où se trouvent les fonctions et classes utilisées, rendant la maintenance difficile : import * est à bannir !

IIIDocumentation

Que l'on écrive ou qu'on utilise une fonction ou un module, la documentation est centrale pour que le travail soit réutilisable.

Parmi les différents mécanismes, l'un des plus simples est la docstring qui peut être attachée à une fonction, à une procédure, à une méthode, à une classe, à un module, ou à un package. Dans tous les cas, c'est une chaîne de caractères qui doit figurer au début de l'entité qu'elle documente.

Cette documentation est ensuite consultable à l'aide de la commande help :

Tableau de 3 lignes, 2 colonnes ;Corps du tableau de 3 lignes ;Ligne 1 : ; >>> import random; Ligne 2 : ; >>> help(random) # affiche la docstring du module; Ligne 3 : ; >>> help(print)  # affiche la docstring de la fonction;

Exemple d'écriture d'une docstring :

Tableau de 10 lignes, 2 colonnes ;Corps du tableau de 10 lignes ;Ligne 1 : ; def factorielle(n) :; Ligne 2 : ;     >> factorielle(5); Ligne 5 : ;         120; Ligne 6 : ;     """; Ligne 7 : ;     res = 1; Ligne 8 : ;     for i in range(2, n + 1):; Ligne 9 : ;         res = res * i; Ligne 10 : ;     return res; " src="/modules-assets/images/PB_Bac_06461_NSIT_gene/PB_Bac_06461_NSIT_gene_p009-036_C01_Tab_52.png" />

Pour lire la suite

Je m'abonne

Et j'accède à l'ensemble
des contenus du site