Complément - niveau intermédiaire¶
Rappel¶
Jusqu’ici nous avons vu les formes d’importation suivantes :
Importer tout un module¶
D’abord pour importer tout un module
import monmoduleImporter un symbole dans un module¶
Dans la vidéo nous venons de voir qu’on peut aussi faire :
from monmodule import monsymbolePour mémoire, le langage permet de faire aussi des import *, qui est d’un usage déconseillé en dehors de l’interpréteur interactif, car cela crée évidemment un risque de collisions non contrôlées des espaces de nommage.
import_module¶
Comme vous pouvez le voir, avec import on ne peut importer qu’un nom fixe. On ne peut pas calculer le nom d’un module, et le charger ensuite :
# si on calcule un nom de module
modulename = "ma" + "th"on ne peut pas ensuite charger le module math avec import puisque
import modulenamecherche un module dont le nom est “modulename”
Sachez que vous pourriez utiliser dans ce cas la fonction import_module du module importlib, qui cette fois permet d’importer un module dont vous avez calculé le nom :
from importlib import import_moduleloaded = import_module(modulename)
type(loaded)moduleNous avons maintenant bien chargé le module math, et on l’a rangé dans la variable loaded
# loaded référence le même objet module que si on avait fait
# import math
import math
math is loadedTrueLa fonction import_module n’est pas d’un usage très courant, dans la pratique on utilise une des formes de import que nous allons voir maintenant, mais import_module va me servir à bien illustrer ce que font, précisément, les différentes formes de import.
Reprenons¶
Maintenant que nous savons ce que fait import_module, on peut récrire les deux formes d’import de cette façon :
# un import simple
import math# peut se récrire
math = import_module('math')Et :
# et un import from
from pathlib import Path# est en gros équivalent à
tmp = import_module('pathlib')
Path = tmp.Path
del tmpimport as¶
Tout un module¶
Dans chacun de ces deux cas, on n’a pas le choix du nom de l’entité importée, et cela pose parfois problème.
Il peut arriver d’écrire un module sous un nom qui semble bien choisi, mais on se rend compte au bout d’un moment qu’il entre en conflit avec un autre symbole.
Par exemple, vous écrivez un module dans un fichier globals.py et vous l’importez dans votre code
import globalsPuis un moment après pour débugger vous voulez utiliser la fonction built-in globals. Sauf que, en vertu de la règle de visibilité des variables (rappelez-vous de la règle “LEGB”, que l’on a vue dans une vidéo de la Semaine 4), le symbole globals se trouve maintenant désigner votre module, et non la fonction.
À ce stade évidemment vous pouvez (devriez) renommer votre module, mais cela peut prendre du temps parce qu’il y a de nombreuses dépendances. En attendant vous pouvez tirer profit de la clause import as dont la forme générale est :
import monmodule as autremodulece qui, toujours à la grosse louche, est équivalent à :
autremodule = import_module('monmodule')Un symbole dans un module¶
On peut aussi importer un symbole spécifique d’un module, sous un autre nom que celui qu’il a dans le module. Ainsi :
from monmodule import monsymbole as autresymbolequi fait quelque chose comme :
temporaire = import_module('monmodule')
autresymbole = temporaire.monsymbole
del temporaireQuelques exemples¶
J’ai écrit des modules jouets :
un_deuxqui définit des fonctionsunetdeux;un_deux_troisqui définit des fonctionsun,deuxettrois;un_deux_trois_quatrequi définit, eh oui, des fonctionsun,deux,troisetquatre.
Toutes ces fonctions se contentent d’écrire leur nom et leur module.
# changer le nom du module importé
import un_deux as one_two
one_two.un()la fonction un dans le module un_deux
# changer le nom d'un symbole importé du module
from un_deux_trois import un as one
one()la fonction un dans le module un_deux_trois
# on peut mélanger tout ça
from un_deux_trois_quatre import un as one, deux, trois as threeone()
deux()
three()la fonction un dans le module un_deux_trois_quatre
la fonction deux dans le module un_deux_trois_quatre
la fonction trois dans le module un_deux_trois_quatre
Pour en savoir plus¶
Vous pouvez vous reporter à la section sur l’instruction import dans la documentation python.