Ich versuche, eine Reihe von Funktionen mit eval () auszuführen, und ich muss eine Art Umgebung erstellen, damit sie ausgeführt werden können. In der Dokumentation wird gesagt, dass Sie globals als zweiten Parameter an eval () übergeben können.
Aber es scheint in meinem Fall nicht zu funktionieren. Hier ist das vereinfachte Beispiel (ich habe zwei Ansätze ausprobiert, Variable global deklariert und globals () verwendet, und beide funktionieren nicht):
Und ich bekomme:
NameError: Der globale Name 'test_variable' ist nicht definiert.
Was soll ich tun, um test_variable
in my_func()
zu übergeben? Angenommen, ich kann es nicht als Parameter übergeben.
test_variable sollte in test.py global sein. Sie erhalten einen Namensfehler, weil Sie versuchen, eine globale Variable zu deklarieren, die noch nicht existiert.
Also sollte Ihre my_test.py Datei wie folgt aussehen:
%Vor%Und führen Sie dies über die Eingabeaufforderung:
%Vor%Im Allgemeinen ist es eine schlechte Form, eval () und globals zu verwenden, also stellen Sie sicher, dass Sie wissen, was Sie tun.
Bitte korrigieren Sie mich Python-Experten, wenn ich falsch liege. Ich lerne auch Python. Im Folgenden verstehe ich, warum die Ausnahme NameError
ausgelöst wurde.
In Python können Sie keine Variable erstellen, auf die moduleübergreifend zugegriffen werden kann, ohne den Modulnamen anzugeben (dh um auf die globale Variable test
in Modul mod1
zuzugreifen, müssen Sie mod1.test
verwenden, wenn Sie sich im Modul% co_de befinden %). Der Gültigkeitsbereich der globalen Variablen ist weitgehend auf das Modul selbst beschränkt.
Also wenn du folgendes in mod2
hast:
Das test.py
bezieht sich hier auf test_variable
(d. h. test.test_variable
im test_variable
-Modul-Namespace).
Wenn Sie also test
in test_variable
setzen, wird die Variable in den script.py
-Namespace ( __main__
, da dies das Modul / Skript der obersten Ebene ist, das Sie dem Python-Interpreter zur Ausführung zur Verfügung gestellt haben). Daher befindet sich __main__
in einem anderen Namespace und nicht im Namespace test_variable
, in dem es erforderlich ist. Daher generiert Python test
, weil es die Variable nicht finden kann, nachdem der globale Namespace NameError
modul und der eingebaute Namespace (der Namespace der lokalen Funktion wegen der test
-Anweisung) übersprungen wurde.
Damit global
funktioniert, müssen Sie eval
im test_variable
-Modulnamensraum in test
:
Weitere Informationen zum Geltungsbereich und den Namespaces von Python finden Sie in Ссылка