En Python, un namespace, ou espace de noms, est le mécanisme qui permet d'associer des noms (comme vos noms de variables, fonctions, classes, etc.) aux objets correspondants en mémoire.
Imaginez sur votre ordinateur deux fichiers patrick.txt ; il n'y aura pas de conflit tant qu'ils sont rangés dans deux dossiers différents.
La plupart des namespaces en Python sont implémentés sous forme de dictionnaires où la clé est le nom de la variable et la valeur l'objet lui-même.
Les différents namespaces
Au moment de l'exécution d'un programme, Python crée différents espaces de noms :
-
Le namespace intégré (built-in) créé au démarrage de Python (
print,len,sorted, etc.) -
Le namespace global créé lors de la lecture d'un module
-
Le namespace local créé à chaque fois qu'une fonction est appelée
-
Le namespace de classe créé à chaque définition de classe
Attention
Pour savoir dans quel ordre Python navigue entre ces espaces pour trouver une variable, il applique la règle LEGB (Local, Enclosing, Global, Built-in). Le namespace de classe n'est pas directement inclus dans cette règle. La résolution des attributs d'une classe suit son propre mécanisme.
Exemple d'utilisation des namespaces
Voici un exemple qui illustre la séparation des espaces :
# --- NAMESPACE GLOBAL --- message = "Bonjour Patrick depuis l'espace global !" def ma_fonction(): # --- NAMESPACE LOCAL --- message = "Bonjour Patrick depuis l'espace local !" print(f"À l'intérieur de la fonction : {message}") ma_fonction() print(f"À l'extérieur de la fonction : {message}") # Résultat : # À l'intérieur de la fonction : Bonjour Patrick depuis l'espace local ! # À l'extérieur de la fonction : Bonjour Patrick depuis l'espace global !
Inscrivez-vous gratuitement pour modifier et exécuter du code Python directement dans votre navigateur.
Nous avons deux variables qui portent le même nom : message. Elles n'entrent pas en conflit, car elles coexistent dans deux namespaces différents.
Quelques points à savoir
Si vous importez deux modules différents qui possèdent chacun une fonction calculer(), les namespaces permettent de les différencier : moduleA.calculer() contre moduleB.calculer().
Vous pouvez inspecter dynamiquement le contenu d'un espace de noms en utilisant les fonctions natives globals() ou locals(). globals() retourne un dictionnaire en direct et modifiable, tandis que locals() retourne un dictionnaire qui ne doit être utilisé qu'en lecture seule.
En résumé :
-
globals()retourne le véritable dictionnaire de l'espace global modifiable -
locals()retourne une copie de l'espace local car les modifications apportées à ce dictionnaire ne sont pas répercutées sur les véritables variables locales en mémoire
# globals() : modification en direct ma_var = 0 print(globals()) # Montre toutes les variables globales dont ma_var globals()["ma_var"] = 42 print(ma_var) # 42 # locals() : lecture seulement (en pratique) def demo(): x = 10 print(locals()) # {'x': 10} demo()