GLO-1901 Introduction à la programmation avec Python Modules et organisation du code Marc Parizeau (automne 2012) © Marc Parizeau, Département de génie électrique et de génie informatique Sunday, 23 September, 12 Plan • Module = fichier.py ✓ permet d'organiser les différents constituants d'un programme en modules indépendants ✓ favorise la réutilisation du code ✓ permet de partitionner l'espace des noms • Processus d'importation • Aperçu de la librairie standard 2 Sunday, 23 September, 12 GLO-1901 ⎯ Modules et organisation du code Architecture d'un programme Python • En général, un programme est constitué d'une hiérarchie de modules ✓ donc plusieurs fichiers ✓ un module peut importer d'autres modules ✓ le processus d'importation rend accessible les objets d'un module 3 Sunday, 23 September, 12 GLO-1901 ⎯ Modules et organisation du code Énoncé import • Forme #1: import module ✓ importe le module module au complet ✓ crée un nouvel espace de noms qui porte le nom du module • Forme #2: from module import attribut1, attribut2, etc. ✓ importe les attributs énumérés du module module ✓ les attributs importés sont copiés dans l'espace de noms actuel • Forme #3: from module import * ✓ importe tous les attributs du modules module ✓ les attributs importés sont copiés dans l'espace de noms actuel 4 Sunday, 23 September, 12 GLO-1901 ⎯ Modules et organisation du code • Par exemple, soit le fichier toto.py qui contient les énoncés suivants: x = 1 y = [1, 2] • Alors, on peut importer les attributs de toto de la façon suivante: ✓ exemple #1 >>> >>> 1 >>> [1, import toto toto.x toto.y 2] ✓ exemple #2 >>> >>> 1 >>> [1, 5 Sunday, 23 September, 12 from toto import x, y x y 2] GLO-1901 ⎯ Modules et organisation du code Librairie standard • La librairie standard contient une panoplie de modules utilitaires ✓ environ 200 modules ✓ tâches relatives au système d'exploitation, persistence des objets, traitements de texte, réseautique, parallélisme, Internet & WWW, interfaces graphiques, etc. 6 Sunday, 23 September, 12 GLO-1901 ⎯ Modules et organisation du code Processus d'importation 1. Trouver le fichier du module ✓ la recherche s'effectue à plusieurs endroits 2. Compiler le code dans un format intermédiaire (s'il y a lieu) ✓ cette étape produit un fichier .pyc pour tous les modules importés 3. Exécuter le code pour créer les objets et les associer aux attributs 7 Sunday, 23 September, 12 GLO-1901 ⎯ Modules et organisation du code Recherche d'un module • La recherche d'un module s'effectue selon les chemins suivants: ✓ le répertoire courant du programme ✓ les chemins définis par la variable d'environnement nommée PYTHONPATH ✓ les répertoires de la librairie standard • La recherche se poursuit jusqu'à ce qu'un fichier portant le bon nom soit trouvé ✓ attention de ne pas cacher les modules standards avec vos propres modules! 8 Sunday, 23 September, 12 GLO-1901 ⎯ Modules et organisation du code • On peut interroger l'attribut path du module sys pour connaître la liste des chemins qui seront explorer par le processus d'importation de modules ✓ sur ma machine, ça donne: >>> import sys >>> sys.path ['', '/Library/Frameworks/Python.framework/ Versions/3.2/lib/python32.zip', '/Library/ Frameworks/Python.framework/Versions/3.2/lib/ python3.2', '/Library/Frameworks/ Python.framework/Versions/3.2/lib/python3.2/ plat-darwin', '/Library/Frameworks/ Python.framework/Versions/3.2/lib/python3.2/libdynload', '/Library/Frameworks/Python.framework/ Versions/3.2/lib/python3.2/site-packages'] 9 Sunday, 23 September, 12 GLO-1901 ⎯ Modules et organisation du code Espace de noms • Le processus d'importation transforme le contenu d'un fichier en un espace de noms contenant l'ensemble des attributs définis dans le fichier ✓ suite à l'importation d'un module toto, tous les attributs x, y, z, etc., du fichier toto.py correspondant s'appeleront dorénavant toto.x, toto.y, toto.z, etc. • «Namespaces are one honking great idea -- let's do more of those!» 10 Sunday, 23 September, 12 GLO-1901 ⎯ Modules et organisation du code Fonction reload • Un module déjà importé ne sera jamais réimporté par l'interpréteur Python ✓ l'interpréteur se souvient des importations • On peut forcer la réimportation d'un module à l'aide de la fonction reload du module imp ✓ permet de modifier le code d'un module sans redémarrer le programme >>> >>> >>> >>> 11 Sunday, 23 September, 12 import toto ... from imp import reload reload(toto) GLO-1901 ⎯ Modules et organisation du code Quiz • Comment faire pour créer un module? • Quelle est la différence entre l'énoncé import et l'énoncé from/import? • Quels genres de problème l'énoncé from/ import peut-il engendrer? • À quoi sert la fonction reload? 12 Sunday, 23 September, 12 GLO-1901 ⎯ Modules et organisation du code Groupe de modules • En mettant plusieurs fichiers dans un même répertoire, on crée un groupe de modules ✓ en anglais, on dit un «package» • En python, on spécifie un chemin pour se rendre à un fichier en séparant les noms de répertoire par des «.» ✓ par exemple: import dir.mod 13 Sunday, 23 September, 12 GLO-1901 ⎯ Modules et organisation du code • Pour que python reconnaisse un répertoire en tant que «package», celui-ci doit contenir un fichier nommé __init__.py ✓ généralement, ce fichier contient des énoncés d'initialisation pour le groupe de modules ✓ le fichier peut être vide, mais il doit néanmoins être présent ✓ son contenu sera exécuté avant l'importation du premier module contenu dans le groupe ✓ le groupe possède son propre espace de noms • Les groupes de modules permettent de regrouper des modules qui travaillent ensembles et, aussi, d'éviter les conflits de noms de fichier ✓ deux modules de même nom peuvent coexister à condition d'appartenir à des groupes différents 14 Sunday, 23 September, 12 GLO-1901 ⎯ Modules et organisation du code Variable __name__ • Cette variable __name__ est automatiquement définie pour chaque module (fichier) • Si le module est exécuté directement par l'interpréteur, alors cette variable prend la valeur __main__ • Au contraire, si le module est importé, alors la variable prend comme valeur le nom du module 15 Sunday, 23 September, 12 GLO-1901 ⎯ Modules et organisation du code • Ceci permet à chaque module de déterminer s'il est exécuté en tant que programme ou en tant que module ✓ en tant que programme, il a le loisir de pouvoir accomplir une tâche particulière ✓ en tant que module, en général, il ne fait rien; il attend qu'on lui dise quoi faire ✓ par exemple: if __name__ == '__main__': """Test de la classe Matrice.""" mat1 = Matrice([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) print(mat1) mat2 = uns(1, 2) print(mat2.transposer()) mat3 = zeros(3, 4) mat3[2, 2] = 12 print(mat3) mat_identite = identite(5) print(mat_identite) 16 Sunday, 23 September, 12 GLO-1901 ⎯ Modules et organisation du code