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:
func.__globals__
ist ein veränderbares Wörterbuch;) a,b,c = innerfunc(a,b,c)
byteplay
python module möglich. 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").
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.