Python eval() et globals()
Je suis en train d'exécuter un certain nombre de fonctions à l'aide de la fonction eval(), et j'ai besoin de créer un certain type d'environnement pour l'exécution. Il est dit dans la documentation que vous pouvez passer globals comme un deuxième paramètre à la fonction eval().
Mais il semble ne pas fonctionner dans mon cas. Voici la simpified exemple (j'ai essayé les deux approches, en déclarant la variable globale et de l'aide globals(), et les deux ne fonctionnent pas):
Fichier script.py:
import test
global test_variable
test_variable = 'test_value'
g = globals()
g['test_variable'] = 'test_value'
eval('test.my_func()', g)
Fichier test.py:
def my_func():
global test_variable
print repr(test_variable)
Et j'obtiens:
NameError: nom global de "test_variable" n'est pas défini.
Que dois-je faire pour passer que test_variable
en my_func()
? En supposant que je ne peux pas passer en tant que paramètre.
OriginalL'auteur Andrey | 2009-04-08
Vous devez vous connecter pour publier un commentaire.
test_variable doit être globale dans test.py. Vous obtenez une erreur de nom parce que vous essayez de déclarer une variable globale qui n'existe pas encore.
De sorte que votre my_test.py fichier devrait ressembler à ceci:
Et l'exécution de ce à partir de l'invite de commande:
Généralement, il est mal vu d'utiliser la fonction eval() et globales, donc assurez-vous que vous savez ce que vous faites.
global test_variable
dans test.py cela ne fonctionne pas, je suppose que c'est parce que c'est dans un autre module, et que vous exécutez ce code dans l'interpréteur.désolé mauvaise écrémage habitudes, essayez ceci
Oh, ça a bien fonctionné, merci beaucoup!
OriginalL'auteur monkut
Veuillez me corriger Python experts si je me trompe. Je suis aussi l'apprentissage de Python. Ce qui suit est ma compréhension actuelle de pourquoi le
NameError
exception a été levée.En Python, vous ne pouvez pas créer une variable qui peut être l'accès à l'ensemble des modules sans préciser le nom du module (c'est à dire d'accéder à la variable globale
test
dans le modulemod1
vous devez utilisermod1.test
lorsque vous dans le modulemod2
). La portée de la variable globale est assez limité pour le module lui-même.Ainsi, lorsque vous avez de la suite dans
test.py
:La
test_variable
se réfère ici àtest.test_variable
(c'est à diretest_variable
dans letest
module espace de noms).Paramètre
test_variable
dansscript.py
va mettre la variable dans le__main__
espace de noms (__main__
parce que c'est le top au niveau du module de script que vous avez fourni à l'interpréteur Python pour exécuter). Ainsi, cettetest_variable
sera dans un espace de noms différent et pas dans letest
module espace de noms où il est nécessaire pour être. Par conséquent, Python génère unNameError
parce qu'il ne trouve pas la variable d'après la recherche dans letest
module espace de noms global et intégré de l'espace de noms (fonction locale de l'espace de noms est ignorée en raison de laglobal
déclaration).Donc, pour
eval
de travail, vous devez définirtest_variable
dans letest
module de l'espace de noms dansscript.py
:Pour plus de détails sur Python du champ d'application et les espaces de noms, voir: http://docs.python.org/tutorial/classes.html#python-scopes-and-name-spaces
OriginalL'auteur maxyfc