Ich versuche, eine Reihe von Funktionen mit auszuführeneval (), und ich muss eine Art Umgebung für sie erstellen. In der Dokumentation heißt es, dass Sie Globals als zweiten Parameter an eval () übergeben können.
Aber es scheint in meinem Fall nicht zu funktionieren. Hier das vereinfachte Beispiel (Ich habe zwei Ansätze ausprobiert, die Variable global deklariert und globals () verwendet, und beide funktionieren nicht):
Datei script.py:
import test
global test_variable
test_variable = "test_value"
g = globals()
g["test_variable"] = "test_value"
eval("test.my_func()", g)
Datei test.py:
def my_func():
global test_variable
print repr(test_variable)
Und ich bekomme:
NameError: Der globale Name "Testvariable" ist nicht definiert.
Was soll ich tun, um das zu bestehen? test_variable
in my_func()
? Angenommen, ich kann es nicht als Parameter übergeben.
Antworten:
10 für die Antwort № 1Testvariable sollte in test.py global sein. Sie erhalten einen Namensfehler, weil Sie versuchen, eine globale Variable zu deklarieren, die noch nicht vorhanden ist.
Ihre my_test.py-Datei sollte also so aussehen:
test_variable = None
def my_func():
print test_variable
Und dies von der Eingabeaufforderung aus ausführen:
>>> import my_test
>>> eval("my_test.my_func()")
None
>>> my_test.test_variable = "hello"
>>> my_test.test_variable
"hello"
>>> eval("my_test.my_func()")
hello
Im Allgemeinen ist es schlecht, eval () und Globals zu verwenden. Stellen Sie also sicher, dass Sie wissen, was Sie tun.
4 für die Antwort № 2
Bitte korrigieren Sie mich, wenn ich mich irre. Ich lerne auch Python. Das Folgende ist mein aktuelles Verständnis, warum die NameError
Ausnahme wurde geworfen.
In Python können Sie keine Variable erstellen, auf die über Module hinweg zugegriffen werden kann, ohne den Modulnamen anzugeben (d. H. Für den Zugriff auf die globale Variable) test
im Modul mod1
Sie müssen verwenden mod1.test
wenn Sie im Modul sind mod2
). Der Gültigkeitsbereich der globalen Variablen ist so ziemlich auf das Modul selbst beschränkt.
Also, wenn Sie folgen haben test.py
:
def my_func():
global test_variable
print repr(test_variable)
Das test_variable
hier bezieht sich auf test.test_variable
(d.h. test_variable
in dem test
Modul-Namensraum).
Also Einstellung test_variable
im script.py
wird die Variable in die __main__
Namespace (__main__
weil dies das Modul / Skript der obersten Ebene ist, das Sie dem Python-Interpreter zur Ausführung zur Verfügung gestellt haben). Also das test_variable
wird sich in einem anderen Namensraum befinden und nicht im test
Modul-Namensraum, wo es sein muss. Daher erzeugt Python eine NameError
weil es die Variable nicht finden kann, nachdem das gesucht wurde test
globaler Namespace des Moduls und integrierter Namespace (lokaler Funktions-Namespace wird aufgrund des eingeblendet global
Aussage).
Daher für eval
um zu arbeiten, musst du einstellen test_variable
in dem test
Modul-Namensraum in script.py
:
import test
test.test_variable = "test_value"
eval("test.my_func()")
Weitere Informationen zum Geltungsbereich und zu den Namespaces von Python finden Sie unter: http://docs.python.org/tutorial/classes.html#python-scopes-and-name-spaces