legb

Qu'est-ce que la règle LEGB en Python ?

L'acronyme LEGB (Local, Enclosing, Global, Built-in) désigne la règle de résolution des noms en Python.

Et comme Python utilise différents namespaces pour stocker les variables, il a besoin d'une règle pour savoir où chercher en cas de noms identiques : du plus spécifique au plus général. D'où le local, enclosing, global et built-in.

Que signifie LEGB ?

Voici l'ordre de priorité strict respecté par Python lors de la résolution d'un nom :

  • Local : Python cherche d'abord dans le namespace local, c'est-à-dire à l'intérieur de la fonction

  • Enclosing : s'il ne trouve rien en local, il cherche dans le namespace de la fonction parente si la fonction actuelle est imbriquée dans une autre. Le mot-clé nonlocal permet de modifier une variable de ce niveau depuis la fonction imbriquée. Je vous invite à lire le glossaire dédié

  • Global : toujours rien ? Python cherche alors au niveau du module

  • Built-in : c'est le dernier recours, il s'agit des fonctions natives de Python (print, len, sorted, etc.), des types (int, str, list, etc.), des exceptions (TypeError, ValueError, etc.) et des singletons (None, True, False)

À noter

Si rien n'est trouvé dans ces quatre niveaux, Python lève l'exception NameError.

print(patrick) # NameError: name 'patrick' is not defined
PYTHON
x = "Patrick est dans le niveau Global (G)"

def fonction_englobante():
    x = "Patrick est dans le niveau Englobant (E)"

    def fonction_locale():
        x = "Patrick est dans le niveau Local (L)"

        # Python cherche 'x' en Local d'abord. Il le trouve !
        print(f"Où suis-je ? {x}")

    fonction_locale()

fonction_englobante()
# Résultat : Où suis-je ? Patrick est dans le niveau Local (L)
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.

Si vous supprimez la ligne x = "Patrick est dans le niveau Local (L)", Python ne trouvera rien au niveau local et passera au niveau enclosing :

x = "Patrick est dans le niveau Global (G)"

def fonction_englobante():
    x = "Patrick est dans le niveau Englobant (E)"

    def fonction_locale():

        print(f"Où suis-je ? {x}")

    fonction_locale()

fonction_englobante()
# Résultat : Où suis-je ? Patrick est dans le niveau Englobant (E)
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.

Et donc, si vous supprimez la ligne x = "Patrick est dans le niveau Englobant (E)", Python passera au niveau global :

x = "Patrick est dans le niveau Global (G)"

def fonction_englobante():

    def fonction_locale():

        print(f"Où suis-je ? {x}")

    fonction_locale()

fonction_englobante()
# Résultat : Où suis-je ? Patrick est dans le niveau Global (G)
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.

Quelques points de vigilance

Évitez l'écrasement des built-ins : ne nommez jamais une variable list, str, id, sorted, etc. Python trouverait votre variable avant la fonction native !

Le mot-clé global permet de modifier une variable globale depuis un espace local. Cependant, l'utilisation de global n'est pas considérée comme une bonne pratique, car elle rend le code difficile à maintenir. Il est préférable de passer la variable en paramètre de la fonction et de retourner une nouvelle valeur.

# Mauvaise pratique avec global
compteur = 0

def incrementer_global():
    global compteur
    compteur += 1

# Bonne pratique avec paramètres
def incrementer(valeur):
    return valeur + 1

compteur = incrementer(compteur)
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.

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.