ProgrammationDéveloppeur Backend

Parlez-nous de ce qui se passe lors de l'importation d'un module en Python. Comment Python recherche-t-il et charge-t-il les modules ? Quelles sont les erreurs typiques que l'on peut commettre en raison d'une mauvaise organisation de l'importation ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse.

Lorsqu'un module est importé en Python, l'interpréteur le recherche dans les répertoires listés dans sys.path. Il recherche d'abord parmi les modules standard, puis parmi les fichiers .py, .pyc et les répertoires contenant le fichier __init__.py (paquets).

  1. Si le module a déjà été importé, une importation répétée le prend simplement depuis sys.modules.
  2. Si le module n'est pas trouvé dans les chemins standard, une exception ModuleNotFoundError sera levée.
  3. Lors de l'importation, le module est compilé en bytecode (.pyc) et mis en cache (si des droits d'écriture sont disponibles).

Exemple :

# mypkg/__init__.py (peut être vide) # mypkg/mod.py # main.py import mypkg.mod
  • Le nom du fichier, la structure des répertoires, la présence/absence de __init__.py (pour Python <3.3 obligatoire) — tout cela a de l'importance.

Comment il recherche :

  • D'abord l'importation absolue.
  • Ensuite, la recherche dans les répertoires sys.path (le répertoire du script courant est toujours le premier).
  • Dans les paquets, le contexte est important (from . import ..., importation absolue/relative).

Question piège.

Que se passera-t-il si un fichier nommé random.py se trouve dans le répertoire de votre script et que vous essayez d'importer le module standard random ?

Réponse :

Le fichier LOCAL random.py sera importé, et non la bibliothèque standard. Une cause fréquente de bugs difficiles à identifier est la collision des noms de modules avec ceux des bibliothèques (shadowing). Il est important d’être vigilant avec le nommage des fichiers.

Exemples d'erreurs réelles dues à l'ignorance des subtilités du sujet.


Histoire

Dans un grand projet, le module email.py a accidentellement éclipsé le module standard email de la bibliothèque, et les développeurs n'ont pas pu comprendre longtemps pourquoi les fonctions de parsing des emails provenant de bibliothèques tierces ne fonctionnaient pas.


Histoire

Dans un projet ML, la fonction os.path ne fonctionnait pas : à côté du script principal se trouvait un fichier os.py, qui interceptait toutes les demandes au module standard. Un mois a été consacré au débogage avant de trouver le conflit de noms.


Histoire

Dans une API REST microservices, des importations circulaires sont survenues lors d'une tentative de faire une importation relative des modèles entre plusieurs sous-paquets. Le problème n'a été résolu qu'après un refactoring de la structure du projet et un ordre explicite de chargement des modules.