Pythons eval () und globals ()

8

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):

Datei script.py :

%Vor%

Datei test.py :

%Vor%

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.

    
Andrey 08.04.2009, 09:30
quelle

2 Antworten

10

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.

    
monkut 08.04.2009, 09:32
quelle
4

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:

%Vor%

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 :

setzen %Vor%

Weitere Informationen zum Geltungsbereich und den Namespaces von Python finden Sie in Ссылка

    
maxyfc 08.04.2009 10:44
quelle

Tags und Links