/ / Python's eval () und globals () - Python, eval

Python's eval () und globals () - Python, eval

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 № 1

Testvariable 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