Früher habe ich in Dieser Anwendungsfallartikel zur Definition verschachtelter Funktionen über Abschlüsse geschrieben, aber die Namen und Werte freier Variablen gelten für Funktionsobjekte. Ich habe versucht herauszufinden, wie es darin aufbewahrt wird. (Im Folgenden wird Python 3 angenommen.)
Freie Python-Variablen sind Variablen, die in einem Codeblock verwendet werden (keine globalen Variablen), aber nicht in diesem Block und in Beschreibung definiert sind. /reference/executionmodel.html).
Im folgenden Code wird beispielsweise die Variable "y" in einer verschachtelten "bar" -Funktion verwendet, sie wird jedoch im Definitionsblock der äußeren "foo" -Funktion definiert. "Y" ist also eine lokale Variable der Funktion "foo" und eine freie Variable der Funktion "bar".
python
def foo():
y = "I'm free in bar."
def bar():
print(y)
y = "I'm still free in bar."
return bar
foo
gibt bar
zurück. Um bar
aufzurufen, benötigen Sie zwei Klammern wie folgt:
python
>>> foo()()
I'm still free in bar.
Übrigens ist der Wert von "y" nicht der Zeitpunkt, zu dem "bar" definiert wird, sondern der Wert, wenn er aufgerufen wird. Im obigen Beispiel wird "y" zweimal in "foo" definiert, aber Sie können sehen, dass es sich um eine später definierte Zeichenfolge handelt.
Was nun das Hauptthema betrifft, so befindet sich auf der Objektseite der äußeren Funktion "foo" der Variablenname "y", der von der verschachtelten Funktion verwendet wird, im "co_cellvars" -Mitglied (Tupel) seines eigenen Codeobjekts ("code"). Ich bin.
python
>>> foo.__code__.co_cellvars
('y',)
Andererseits wird auf der Objektseite "bar" "y" als freie Variable im Mitglied "co_freevars" des Codeobjekts benannt. (Das foo () unten ist bar.)
python
>>> foo().__code__.co_freevars
('y',)
Der Inhalt der freien Variablen ist im Tupel des Attributs "closure" als "cell" -Objekt enthalten und kann wie folgt als "cell_contents" abgerufen werden.
python
>>> foo().__closure__[0].cell_contents
"I'm still free in bar."
Recommended Posts