Zugriff auf den äußeren Bereich in Python 2.6

7

Sagen wir, ich habe einen Gültigkeitsbereich mit Variablen, und eine in diesem Bereich aufgerufene Funktion möchte einige unveränderliche Variablen ändern:

%Vor%

Ist es irgendwie möglich, auf den äußeren Bereich zuzugreifen? So etwas wie nonlocal Variablen aus Py3k.

Natürlich kann ich in diesem Fall s,n = modify(s,n) machen, aber was ist, wenn ich eine generische "Injektion" brauche, die dort ausgeführt wird und in der Lage sein muss, willkürlichen Variablen zuzuordnen?

Ich habe Leistung im Sinn, also, wenn möglich, eval & amp; Stapelrahmenprüfung ist nicht erwünscht:)

UPD : Es ist unmöglich. Zeitraum. Es gibt jedoch einige Optionen für den Zugriff auf Variablen im äußeren Bereich:

  1. Verwenden Sie Globals. By the way, func.__globals__ ist ein veränderbares Wörterbuch;)
  2. Speichern Sie Variablen in einer dict / class-Instanz / einem anderen veränderbaren Container
  3. Gib Variablen als Argumente & amp; hol sie als Tupel zurück: a,b,c = innerfunc(a,b,c)
  4. Den Bytecode der anderen Funktion injizieren. Dies ist mit byteplay python module möglich.
kolypto 21.01.2011, 21:27
quelle

5 Antworten

3

Dies ist nicht wie nonlocal funktioniert. Es bietet kein dynamisches Scoping (was nur ein großer PITA ist, der darauf wartet, passiert zu sein und noch seltener nützlich als die durchschnittliche "böse" -Funktion). Es behebt nur lexikalische Scoping.

Wie auch immer, Sie können nicht tun, was Sie vorhaben (und ich würde sagen, das ist eine gute Sache). Es gibt nicht einmal einen dreckigen, aber leichten Hack (und während wir dabei sind: Solche Hacks werden nicht entmutigt, weil sie im Allgemeinen ein bisschen schlechter abschneiden!). Vergiss es einfach und löse das wahre Problem richtig (du hast es nicht genannt, also können wir dazu nichts sagen).

Am ehesten ist es möglich, ein Objekt zu definieren, das alles enthält, was Sie teilen wollen, und es explizit weiterzugeben (z. B. eine Klasse erstellen und self verwenden, wie in einer anderen Antwort vorgeschlagen). Aber das ist überall relativ mühsam und immer noch Hacking (wenn auch besser als dynamisches Scoping, weil "explizit ist besser als implizit").

    
delnan 21.01.2011, 21:33
quelle
7

Definieren Sie die Variablen außerhalb der Funktionen und verwenden Sie das Schlüsselwort global .

%Vor%     
orlp 21.01.2011 21:30
quelle
7

Manchmal laufe ich auf Code wie diesen. Eine verschachtelte Funktion ändert ein veränderbares Objekt, anstatt es einem nonlocal zuzuordnen:

%Vor%     
joeforker 21.01.2011 21:42
quelle
3

Sie können globale Variablen verwenden,

%Vor%

oder definieren Sie diese als Methoden und verwenden Sie eine Klassen- oder Instanzvariable.

%Vor%     
gotgenes 21.01.2011 21:33
quelle
1

Sie können das wahrscheinlich auch tun (nicht sagen, dass es richtig ist);

Definieren Sie eine Funktion, die ein Array mit Zeilen wie folgt zurückgibt

%Vor%

Dann mach in dem Bereich die Vars

%Vor%

das ist aber ziemlich verdammt hacky.

    
Pablo Jomer 13.08.2012 07:01
quelle

Tags und Links