4 votes

En utilisant des variables globales dans Python exec

Je suis en train de créer une application de type interpréteur Python personnalisé. J'utilise l'instruction exec (en Python 2.7.6) pour exécuter le code donné mais les variables globales ne fonctionnent pas tout à fait comme prévu. Est-ce que quelqu'un pourrait expliquer pourquoi cela ne fonctionne pas :

def print_x():
    print(x)

g = {'x': 10, 'print_x': print_x}
l = {}

exec('print_x()', g, l)

Le résultat (que la fonction print_x soit dans g ou dans l), est une erreur :

NameError: global name 'x' is not defined

Alors, est-ce que les variables globales passées à exec ne sont pas transmises aux fonctions appelées ?

3voto

mgilson Points 92954

Le x à l'intérieur de la fonction est pris à partir des variables globales de l'espace de noms où la fonction est définie. Cependant, vous l'appelez dans un espace de noms différent. Ceci n'est pas très différent du fait d'avoir de multiples modules :

# foo.py
def print_x():
    print(x)

et ensuite essayer de l'utiliser dans un module différent :

# bar.py
from foo import print_x

x = 10
print_x()  # NameError

En fin de compte, g représente les variables globales dans le contexte d'exécution de exec. Après avoir appelé la fonction print_x (qui a été définie dans un contexte global différent), vous ne pouvez pas vous attendre à ce que print_x connaisse quoi que ce soit sur les variables globales dans le contexte d'exécution de exec -- print_x connaît seulement les variables globales dans le contexte de son module.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X