namespaces

Que sont les namespaces en Python ?

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 !
PYTHON
Un instant

Créez un compte pour exécuter ce code

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()
PYTHON

Bravo, tu es prêt à passer à la suite

Rechercher sur le site

Inscris-toi à Docstring

Pour commencer ton apprentissage.

Tu as déjà un compte ? Connecte-toi.