Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Licence CC BY-NC-ND Thierry Parmentelat & Arnaud Legout Inria - UCA

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 monmodule

Importer un symbole dans un module

Dans la vidéo nous venons de voir qu’on peut aussi faire :

from monmodule import monsymbole

Pour 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 modulename

cherche 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_module
loaded = import_module(modulename)
type(loaded)
module

Nous 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 loaded
True

La 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 tmp

import 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 globals

Puis 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 autremodule

ce 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 autresymbole

qui fait quelque chose comme :

temporaire = import_module('monmodule')
autresymbole = temporaire.monsymbole
del temporaire

Quelques exemples

J’ai écrit des modules jouets :

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 three
one()
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.