ProgrammationDéveloppeur Python

Parlez des caractéristiques de l'organisation des espaces de noms (namespaces) et des modules en Python. Comment fonctionnent les imports et comment éviter les conflits de noms dans un grand projet ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse.

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.

Fonctionnement des imports

  • 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 :

  • Utilisez l'import explicite de modules (import mymodule), et non l'étoile (from... import *).
  • Organisez le projet à l'aide de paquets (répertoires avec __init__.py).
  • Utilisez des noms uniques et parlants ;
  • Appliquez des alias (import module as m).

Exemple de structure

projet/
  paquet/
    __init__.py
    module1.py
    module2.py
import paquet.module1 from paquet.module2 import fonction as fn

Question piège.

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é

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


Histoire

Les développeurs utilisaient 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

Dans un grand projet, différentes équipes ont créé des modules avec des noms identiques (par exemple, 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.