Gibt es in Python eine Möglichkeit, den Bereich zu verwalten, so dass Variablen in aufrufenden Funktionen in aufgerufenen Funktionen sichtbar sind? Ich möchte etwas wie das folgende
%Vor%Ich möchte die folgende Ausgabe erhalten
%Vor%Die wirkliche Lösung für dieses Problem besteht darin, z als Variable zu übergeben. Ich will das nicht machen.
Ich habe eine große und komplexe Codebasis mit Benutzern unterschiedlicher Fachkenntnisse. Sie sind derzeit trainiert, eine Variable durchzulassen, und jetzt muss ich eine weitere hinzufügen. Ich traue ihnen nicht, die zweite Variable durch alle Funktionsaufrufe konsequent zu übergeben, also suche ich nach einer Alternative, die die Schnittstelle beibehält. Es besteht eine gute Chance, dass dies nicht möglich ist.
Ich denke, das ist es wonach Sie suchen. Wenn Sie die inneren Funktionen steuern und sich die gesuchte Variable bereits irgendwo in der Aufrufkette befindet, möchten Sie jedoch nicht, dass Ihre Benutzer die Variable in den Aufruf selbst aufnehmen müssen. Sie möchten das global
-Schlüsselwort natürlich nicht, weil Sie nicht möchten, dass innere Zuweisungen den äußeren Geltungsbereich beeinflussen.
Mit dem Modul inspect
erhalten Sie Zugriff auf den aufrufenden Kontext. (Aber seien Sie gewarnt, dass es etwas fragil ist. Sie sollten es wahrscheinlich nur für CPython ohne Thread verwenden.)
Dies gibt die richtige Antwort:
%Vor%Dies könnte der richtige Ort für eine Klasse sein:
%Vor%Sie können den gleichen Effekt mit globals erzielen, aber ich würde vorschlagen, dass Sie einen eigenen separaten Namespace erstellen (z. B. mit einer Klasse) und diesen für Ihren Bereich verwenden.
Ich verstehe nicht ganz, was Sie erreichen wollen, aber das druckt 2, 4, 2:
%Vor% Das ist ein bisschen hässlich, aber es vermeidet die Verwendung von Globalen, und ich habe es getestet und es funktioniert. Verwenden Sie den Code aus der ausgewählten Antwort here , die Funktion getSetZ()
hat eine "statische" Variable, die verwendet werden kann, um einen Wert zu speichern, der an sie übergeben und dann abgerufen wird, wenn die Funktion mit None
als Parameter aufgerufen wird. Bei bestimmten Einschränkungen wird davon ausgegangen, dass None
kein möglicher Wert für z ist und dass Sie keine Threads verwenden. Sie müssen nur daran denken, getSetZ()
vor jedem Aufruf einer Funktion aufzurufen, in der die z
der aufrufenden Funktion verfügbar sein soll, und den Wert aus getSetZ()
zu holen und ihn in eine lokale Variable einzufügen Funktion.
Ich hoffe, das hilft.
Im Allgemeinen ist die beste Lösung immer nur die Werte herumzugeben - dies wird viel vorhersagbarer und natürlicher, einfacher zu handhaben und zu debuggen:
%Vor% Sie könnten a()
in b()
definieren und etwas ähnliches tun:
Das ist jedoch nicht wirklich optimal.