Wo ist nonlocals ()?

Wie erhalte ich die nicht-lokalen Variablen für den aktuellen Umfang? Die Funktionen vars , locals und globals existieren, aber gibt es eine Funktion, um die globals zu bekommen?

Warum sind nicht die Nichtlokale aufgeführt, wenn sie vars anrufen?

Aktualisieren

Mein Problem ist, dass es keine Möglichkeit gibt, die im aktuellen Umfang verfügbaren Variablen aufzuzählen, da weder vars oder globals die Nicht-Einheimischen AFAICT enthält.

Ich verwende häufig vars in Code wie die folgenden:

 '{meh[0]}/{meh[3]} {a}{b}{c}'.format(**vars()) 

Was fehlschlägt, wenn eine dieser Variablen im Rahmen einer enthaltenden Funktion ist.

One Solution collect form web for “Wo ist nonlocals ()?”

Von laufendem Code können Sie ganz einfach die Namen der nonlocal Variablen – aber retten Sie ihre Inhalte in einer Art und Weise ein Aufruf an locals bekommt man ein Wörterbuch ist ein bisschen schwieriger.

Die verwendeten nonlocal Variablennamen werden im aktuellen laufenden Codeobjekt im Attribut co_freevars gespeichert.

Also, das Erhalten der nichtlokalen Namen ist eine Frage von:

names = inspect.currentframe().f_code.co_freevars

Die Inhalte für diese Variablen werden jedoch im Attribut func_closure ( func_closure , in Python 2) des Funktionsobjekts gespeichert. (Nicht das Codeobjekt). Das Problem ist, dass, ohne "Hilfe von außen", gibt es keinen einfachen Weg für einen laufenden Code, um das Funktionsobjekt zu bekommen, auf dem es läuft. Sie gelangen auf das Rahmenobjekt, das mit dem Codeobjekt verknüpft ist, aber es gibt keine Links zum Funktionsobjekt. (Für eine obere Ebene definierte Funktion kann man explizit die Funktion namens name verwenden, wie sie in der def Anweisung verwendet wird, aber für eine eingeschlossene Funktion, die an einen Anrufer zurückgegeben wird, gibt es auch keine Möglichkeit, ihren Namen zu kennen).

So muss man auf einen Trick zurückgreifen, der alle Objekte, die mit dem aktuellen Codeobjekt verknüpfen, mit dem gc-Modul (Garbage Collector) – es gibt einen gc.get_referrers call – es wird alle Funktionsobjekte zurückgeben, auf die gc.get_referrers wird Das Codeobjekt man hält.

Also, innerhalb einer Funktion mit non_local Variablen könnte man:

 import inspect, gc def a(b): b1 = 2 def c(): nonlocal b1 print (b) code = inspect.currentframe().f_code names = code.co_freevars function = [func for func in gc.get_referrers(code) if isinstance(func, FunctionType)][0] nonlocals = dict (zip(names, (x.cell_contents for x in function.__closure__ ))) print(nonlocals) return inspect.currentframe() return c c = a(5) f = c() 

Und damit die Namen und Werte der Nichtlokale abrufen. Aber das wird nicht funktionieren, wenn man mehr als eine Instanz dieser Funktion hat (das heißt, wenn die Funktion der Interessierten mehr als einmal mit mehr als einem Aufruf an die Funktine, die es erzeugt, geschaffen wurde) – da alle diese Instanzen werden Link zu demselben Codeobjekt. Das obige Beispiel geht davon aus, dass es nur eine Funktion gibt, die mit dem aktuellen Code läuft – und würde in diesem Fall korrekt funktionieren. Ein weiterer Aufruf zur Factrory-Funktion würde eine weitere Funktion schaffen, mit potenziell anderen Werten für die nichtlokalen Variablen, aber mit demselben Codeobjekt – die function = Listengenrator oben würde alle diese abrufen und willkürlich die erste von diesen auswählen.

Die "richtige" Funktion ist diejenige, auf der der aktuelle Code ausgeführt wird – ich versuche, an eine Möglichkeit zu denken, diese Informationen abzurufen, kann aber nicht dazu kommen. Wenn ich kann, werde ich diese Antwort abschließen, aber für jetzt kann dies nicht helfen Ihnen, die nonlocals Werte Werte abzurufen.

(Nur herausgefunden, dass versucht, "eval" mit einem nichtlokalen Variablennamen verwenden wird auch nicht funktionieren)

Es sieht so aus, dass nur die Verknüpfung des aktuellen laufenden Rahmens mit dem Funktionsobjekt, in dem die nichtlokalen Variablenwerte gehalten werden, zur Laufzeit innerhalb der nativen Seite des Python-Interpreters erstellt wird. Ich kann nicht an einen Weg denken, um es zu vermeiden, das Ctypes-Modul zu benutzen, um die Datenstrukturen zur Laufzeit zu betrachten, was natürlich für jeden aktuellen Produktionscode ungeeignet wäre.

Die untere Zeile: Sie können die nichtlokalen Variablennamen zuverlässig abrufen. Aber es sieht so aus, als könnt ihr keinen Wert bekommen, den ihr Name als String gegeben hat (noch rebind).

Sie könnten versuchen, eine Feature-Anfrage für einen "nonlocals" -Aufruf auf Python's Bug Tracker oder auf Python-Ideen Mailing-Liste zu öffnen.

  • Python erhalten Modul variabel nach Namen
  • Python - wie man die Liste der Selbstvariablen in einer Klasse erhält, besteht aus N-self
  • Python bedingter Zuweisungsoperator
  • Nltk fügt nicht $ NLTK_DATA zum Suchpfad hinzu?
  • Tensorflow set CUDA_VISIBLE_DEVICES innerhalb von jupyter
  • Wie kann ich ein Ergebnis einer Funktion in einer Variable in Python speichern?
  • Alle Variablen global machen
  • Warum ist die Instanzvariable nach dem Ausführen der Funktion nicht verloren?
  • Linux profile.d Umgebungsvariablen funktionieren nicht mit cx_oracle in Python
  • Unterschied zwischen a - = b und a = a - b in Python
  • Python URL Variable int Zu String hinzufügen
  • Python ist die beste Programmiersprache der Welt.