Modules - import
¶
Module¶
Un module est basiquement un fichier nom_module.py
ordinaire. Les variables, fonctions, classes qui y sont définies peuvent être importées afin d’être réutilisées.
Python est accompagné de nombreux modules; ils forment sa librairie standard. On y trouve par exemple les modules random, math, tkinter et beaucoup d’autres.
Importer un module et l’utiliser -
import <nom_module>
:>>> import random # random -> aléatoire >>> random.randint(1,6) # «dé electronique» 2 >>> def de(): # trop long à écrire ? ... return random.randint(1,6) ... >>> de() 3 >>> de() 1 >>> random.choice('abcdefghijklmnop') # caractère aléatoire de la chaîne 'h'
Utiliser un alias -
import <nom_module> as <alias>
:>>> import random as alea >>> l = [1, 2, 3, 4] >>> alea.shuffle(l) >>> l [1, 4, 2, 3]
Importer une ou plusieurs fonctions d’un module -
from module import f1, f2, ...
:>>> from math import sqrt as racine, exp, log as ln, e >>> r = racine(5) >>> r 2.23606797749979 >>> round(r,2) 2.24 >>> [(x, round(racine(x), 2) ) for x in [0,1,2,3,4,5]] [(0, 0.0), (1, 1.0), (2, 1.41), (3, 1.73), (4, 2.0), (5, 2.24)] >>> from random import uniform >>> x = uniform(0, 100) >>> ln(exp(x)) == x True >>> exp(ln(x)) == x True >>> e 2.718281828459045 >>> ln(e) 1.0
Importer tout ce qu’un module définit -
from <nom_module> import *
:>>> from tkinter import * >>> fenetre = Tk() # une fenêtre devrait apparaître >>> bouton = Button(fenetre, text="cliquez moi !", command=fenetre.destroy) >>> # le bouton n'apparaît pas ??? normal, il faut encore le positionner >>> bouton.pack()
Avertissement
Procéder de la sorte est généralement déconseillé car de nombreux «noms» sont alors introduis dans l’interpréteur Python ce qui peut être source de conflits (en cas de multiples imports par exemple). Vous pouvez toutefois utiliser cette facilité pour écrire de petits programmes de découvertes de tel ou tel module:
>>> # La fonction dir(truc) sert à connaître les noms définis dans le contexte de «truc» >>> dir() # si «truc» est omis, c'est le contexte courant ['__builtins__', '__doc__', '__name__', '__package__'] >>> a = 5 >>> dir() # le nom «a» existe à présent ['__builtins__', '__doc__', '__name__', '__package__', 'a'] >>> import tkinter >>> dir() # seul le nom «tkinter» (ou plutôt l'espace de nom) est importé ['__builtins__', '__doc__', '__name__', '__package__', 'a', 'tkinter'] >>> from tkinter import * >>> dir() # et maintenant ? argh ! ['ACTIVE', 'ALL', 'ANCHOR', 'ARC', 'At', 'AtEnd', 'AtInsert', 'AtSelFirst', 'AtSelLast', 'BASELINE', 'BEVEL', 'BOTH', 'BOTTOM', 'BROWSE', 'BUTT', 'BaseWidget', 'BitmapImage', 'BooleanVar', 'Button', 'CASCADE', 'CENTER', 'CHAR', 'CHECKBUTTON', 'CHORD', 'COMMAND', 'CURRENT' ...
Mon module: exemple¶
Créer un fichier d’extension
.py
. Dans cet exemple, il s’appellemonModule.py
:# définitions de monModule.py CONST = 3.14 def truc(): print("Salut cowboy.")
Démarrer l’interpréteur depuis le dossier qui contient le fichier
monModule.py
:>>> from monModule import * >>> CONST 3.14 >>> truc() Salut cowboy.
Note
Votre module sera chargé pourvu que Python puisse le trouver ! Pour savoir où Python cherche les modules:
>>> import sys >>> sys.path # affiche la liste des dossiers de recherche des modules
Tester son module -
if __name__ == '__main__':
:# ajouter les lignes suivantes à votre module puis exécuter le normalement if __name__ == '__main__': # __name__ vaut '__main__' # seulement si Python est # directement appelé sur ce fichier # code pour tester le module: print(CONST) truc()
Notion de Paquet (avancé)¶
Un paquet - package - sert à regrouper logiquement plusieurs modules. En pratique, c’est un dossier caractérisé par la présence d’un fichier __init__.py
(qui peut être vide). Outre ce fichier «spécial», on y trouve les modules et éventuellement d’autres paquets...
Un paquet est donc un dossier de la forme:
paquet/ __init__.py module1.py module2.py sousPaquet/ __init__.py autreModule.py ... ...
Importer un paquet (revient en fait à «charger» son
__init__.py
) -import <paquet>
:import paquet # si son __init__.py définit la fonction «truc» paquet.truc() # ok truc() # pas ok ! from paquet import truc truc() # là ok
Importer un module contenu dans un paquet -
import <paquet>.<module>
ou aussifrom <paquet> import <module>
:import paquet.module1 # si module1.py définit la fonction «bidulle» paquet.module1.bidulle() # ok. # vous pouvez utiliser un alias import paquet.module1 as pm1 pm1.bidulle() # ok # ou encore from paquet import module1 module1.bidulle() # ok # Enfin, pour importer «autreModule» import paquet.sousPaquet.autreModule
Importer un (ou plusieurs) «objets» définis dans un module d’un paquet -
from <paquet>.<module> import obj1, obj2, ...
.Sens particulier de
from <paquet> import *
.On pourrait penser que ça charge tous les (sous)modules de <paquet> mais ce n’est en général pas le cas; La convention est la suivante:
si le fichier
__init__.py
définit une liste nommée__all__
, elle est utilisée comme la liste des noms de modules qui devraient être chargés sifrom <paquet> import *
est utilisé.