En Python, un espace de noms (namespace) est un dictionnaire qui associe des noms à des objets. Les niveaux d'espaces de noms sont : local, global, et intégré. Les modules sont des espaces distincts pour organiser le code. Lors de l'importation, Python crée un nouvel espace de noms pour chaque module.
import module — importe le module et accède aux objets via module.name.from module import name — importe un objet du module directement dans l'espace actuel (risque de conflits de noms).as — permet d'attribuer un alias.Pour éviter les conflits de noms :
import mymodule), et non l'étoile (from... import *).__init__.py).import module as m).projet/
paquet/
__init__.py
module1.py
module2.py
import paquet.module1 from paquet.module2 import fonction as fn
Question : Quelle est la différence entre l'importation d'un module deux fois ? Le code entier du module sera-t-il exécuté à nouveau ?
Réponse : Non. Lors du premier import, le module est exécuté et le résultat est mis en cache dans sys.modules. L'importation répétée renvoie déjà l'objet de module chargé, son code n'est pas exécuté à nouveau.
# module.py print('Bonjour !') # main.py import module # affichera Bonjour ! import module # rien ne sera affiché
Histoire
from settings import * dans plusieurs modules, entraînant que lors de la modification des paramètres, des variables locales étaient "réécrites" de manière inattendue, provoquant des bugs difficiles à détecter.Histoire
utils.py). Lors de l'intégration, les modules avec des noms "identiques" "remplaçaient" les uns les autres, entraînant des comportements inattendus et des bugs difficiles à résoudre.Histoire
Dans l'une des bibliothèques, ils ont essayé de "réimporter à chaud" un module avec de nouveaux paramètres via importlib.reload. Ils n'ont pas pris en compte que d'autres modules déjà importés avaient conservé d'anciennes références aux objets, ce qui a entraîné des modifications non appliquées dans toutes les parties de l'application.