Python: Wie kann ich eval () im lokalen Gültigkeitsbereich einer Funktion ausführen?

Ich versuche, eval () in einem lokalen Bereich einer Funktion zu verwenden. Allerdings wird es immer im globalen Bereich ausgewertet.

Selbständige Beispiele:

1- Dieser Code funktioniert:

var1 = 1 var2 = 2 var3 = 3 myDict = dict((name, eval(name)) for name in ["var1", "var2", "var3"]) print(myDict["var1"]) 

2- Throws NameError für lvar1

 def test1(): lvar1 = 1 lvar2 = 2 lvar3 = 3 myDict = dict((name, eval(name)) for name in ["lvar1", "lvar2", "lvar3"]) print(myDict["lvar1"]) 

3- Gleiches Ergebnis als 2.

 def test2(): lvar1 = 1 lvar2 = 2 lvar3 = 3 myDict = dict((name, eval(name), locals()) for name in ["lvar1", "lvar2", "lvar3"]) print(myDict["lvar1"]) 

2 Solutions collect form web for “Python: Wie kann ich eval () im lokalen Gültigkeitsbereich einer Funktion ausführen?”

Speichern Sie das Ergebnis der locals() (oder vars() ), um den lokalen Bereich der Funktion zurückzugeben. Andernfalls werden die locals() innerhalb des Generatorausdrucks den lokalen Bereich des Gen-Expr zurückgeben.

 def test3(): lvar1 = 1 lvar2 = 2 lvar3 = 3 scope = locals() myDict = dict((name, eval(name, scope)) for name in [ "lvar1", "lvar2", "lvar3"]) print(myDict["lvar1"]) 

BTW, Wörterbucherstellung ist nicht notwendig:

 myDict = locals() # or vars() 

Zuerst ist es wichtig, dies zu lesen :

Das Ausdrucksargument wird als Python-Ausdruck (technisch gesehen eine Bedingungsliste) analysiert und ausgewertet, wobei die globalen und lokalen Wörterbücher als globaler und lokaler Namespace verwendet werden. Wenn das globale Wörterbuch vorhanden ist und fehlt '__builtins__' , werden die aktuellen globals in globals kopiert, bevor der Ausdruck geparst wird. Dies bedeutet, dass Ausdruck normalerweise den vollen Zugriff auf das Standard-Modul __builtin__ und eingeschränkte Umgebungen propagiert werden. Wenn das Einheimische Wörterbuch weggelassen wird, wird es standardmäßig auf das globale Wörterbuch gestellt. Wenn beide Wörterbücher weggelassen werden, wird der Ausdruck in der Umgebung ausgeführt, in der eval() aufgerufen wird. Der Rückgabewert ist das Ergebnis des ausgewerteten Ausdrucks.

Es ist wichtig zu bemerken, dass ein Generatorausdruck seinen eigenen Umfang hat (auch für ein Dict-Verständnis), daher hat er sein eigenes locals() Wörterbuch.

  1. Dies funktionierte, weil im globalen Geltungsbereich sowohl globals() als auch globals() dict Punkte auf das gleiche Wörterbuch daher der Dict-Konstruktor auf diese Variablen zugreifen können.

  2. Hier rufen wir wieder eval() ohne globals() und locals() dict daher endet mit dem globalen scope und seinem eigenen lokalen scope (was leer ist) und es gibt keine solche variable in einem dieser bereiche verfügbar.

  3. Denken Sie daran, Generatoren haben ihre eigenen Umfang so rufenden locals() hier kaum macht einen Unterschied, es ist ein leerer Dict.

Lösung:

 def test1(): lvar1 = 1 lvar2 = 2 lvar3 = 3 test1_locals = locals() myDict = dict((name, eval(name, test1_locals)) for name in ["lvar1", "lvar2", "lvar3"]) print myDict print(myDict["lvar1"]) 

Dies funktionierte, weil wir test1's locals() in einer Variable erfasst und dann dieses Wörterbuch innerhalb des Wörterbuchverstehens verwendet haben, also hat es nun Zugriff auf diese Variablen.

  • Pythonumfang [doppelte]
  • Python Variable Scope (Vorbehalt durch Verweis oder Kopie?)
  • Wie kann man Variablen eines anderen Bereichs ändern?
  • Warum erbt keine Unterfunktion den Bereich in Python?
  • Python überschreibt Variablen in verschachtelten Funktionen
  • Blockieren Sie den Bereich in Python
  • Funktion Ortsname Bindung aus einem äußeren Bereich
  • Wie kann man neue Scopes in Python schaffen?
  • UnboundLocalError bei der Manipulation von Variablen ergibt inkonsistentes Verhalten
  • Python: Variablen sind noch zugänglich, wenn in try oder if definiert?
  • Den Block der Befehle, die in der mit Anweisung ausgeführt werden sollen
  • Python ist die beste Programmiersprache der Welt.