[PYTHON] Suchen Sie den Namen und die Daten einer freien Variablen in einem Funktionsobjekt

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

Suchen Sie den Namen und die Daten einer freien Variablen in einem Funktionsobjekt
Trennung von Design und Daten in matplotlib
Python-Variablen und Datentypen, die mit Chemoinfomatik gelernt wurden
Holen Sie sich den Aufrufer einer Funktion in Python
Organisieren Sie die Bedeutung von Methoden, Klassen und Objekten
Korrigieren Sie die Argumente der in map verwendeten Funktion
Die Geschichte des Lesens von HSPICE-Daten in Python
Das einfachste Python-Memo in Japan (Klassen und Objekte)
Verarbeitung von CSV-Daten in voller und halber Breite in Python
Extrahieren und listen Sie die Namen von Personen und Orten im Text auf
Unterschied zwischen Ruby und Python in Bezug auf Variablen
Über die Ineffizienz der Datenübertragung im luigi on-memory
Wählen Sie die erforderlichen Variablen in TensorFlow aus und speichern / wiederherstellen
Den Inhalt der Daten in Python nicht kennen
Verwenden wir die offenen Daten von "Mamebus" in Python
Versuchen Sie, COVID-19 Tokyo-Daten mit Python zu kratzen
[Blender] Kennen Sie den Auswahlstatus von versteckten Objekten im Outliner
Sehen Sie, wie schnell Sie mit NumPy / SciPy beschleunigen können
Lassen Sie das Gleichungsdiagramm der linearen Funktion in Python zeichnen
Referenzreihenfolge von Klassenvariablen und Instanzvariablen in "self. Klassenvariablen" in Python
Durchsuche den pandas.DataFrame mit einer Variablen und erhalte die entsprechende Zeile.
[Homologie] Zählen Sie mit Python die Anzahl der Löcher in den Daten
Datenstrukturen vom Listentyp und ihre Operationen im Linux-Kernel
Machen Sie die Funktion zum Zeichnen japanischer Schriftarten in OpenCV allgemein
[Tipps] Probleme und Lösungen bei der Entwicklung von Python + Kivy
Ich habe die Daten von Raspberry Pi an GCP gesendet (kostenlos)
Ich habe versucht, die Exponentialfunktion und die Logistikfunktion an die Anzahl der COVID-19-positiven Patienten in Tokio anzupassen
Informationen zu Python-Variablen und -Objekten
[Python] Der Ursprung des Namens der Python-Funktion
Objektäquivalenzbeurteilung in Python
Beginn der Niko Niko Encyclopedia Analysis ~ JSON und berühren Sie die bereitgestellten Daten ~
Verschrotten Sie den Zeitplan von Hinatazaka 46 und spiegeln Sie ihn in Google Kalender wider
Versuchen Sie, die stochastische Massenfunktion der Binomialverteilung in Python zu transkribieren
Über Boxplot und Violinplot, die die Variation unabhängiger Daten visualisieren
Wahrscheinlichkeit der höchsten und niedrigsten Jungtierpreise in Atsumori
Organisieren Sie nützliche Blogs im Bereich Data Science (Übersee & Japan).
Fühlen Sie sich frei, das Legendenlabel mit Seaborn in Python zu ändern
Benachrichtigen Sie den Inhalt der Aufgabe vor und nach der Ausführung der Aufgabe mit Fabric
Eine Funktion, die die Verarbeitungszeit einer Methode in Python misst
Durchsuchen Sie das Verzeichnis und erstellen Sie eine Liste mit Verzeichnispfaden und Dateinamen
Erstellen Sie eine Funktion, um den Inhalt der Datenbank in Go abzurufen
Überprüfen Sie die Komprimierungsrate und -zeit von PIXZ, die in der Praxis verwendet werden
Holen Sie sich den Titel und das Lieferdatum von Yahoo! News in Python
Richten Sie mit Python einen Dummy-SMTP-Server ein und überprüfen Sie den Sendevorgang von Action Mailer
Verwenden Sie Cloud Dataflow, um das Ziel dynamisch entsprechend dem Wert der Daten zu ändern und in GCS zu speichern
Wenn tkinter in einem anderen Thread gestartet wird, beenden Sie die Verarbeitung durch diesen Thread selbst, bereinigen Sie die Variablen und beenden Sie den Thread.