Hinter den Kulissen der Python-Closure-Funktion
Von Idego Group

In diesem Artikel erfahren wir, was ein Python-Closure ist, wie man es verwendet und wofür es eingesetzt werden kann. Außerdem erklären wir Begriffe wie nonlocal und freie Variablen, was ein Variablenbereich ist und was verschachtelte und erstklassige Funktionen sind.
Ein Closure ist eine Technik zur Implementierung lexikalisch bereichsbezogener Namensbindung in einer Sprache mit erstklassigen Funktionen. Operationell ist ein Closure ein Datensatz, der eine Funktion zusammen mit einer Umgebung speichert. Die Umgebung ist eine Zuordnung, die jede freie Variable der Funktion mit dem Wert oder der Referenz verknüpft, an die der Name beim Erstellen des Closures gebunden war.
Eine innerhalb einer anderen Funktion definierte Funktion wird als verschachtelte Funktion bezeichnet. In Python kann auf die Variable innerhalb des Bereichs zugegriffen werden, in dem sie erstellt wurde. Funktionen in Python sind erstklassige Funktionen, was bedeutet, dass sie wie Objekte behandelt werden können — als Argumente übergeben, zugewiesen oder zurückgegeben werden.
Ein Closure-Beispiel im Vergleich zu einem klassenbasierten Ansatz zeigt, dass beide ähnliche Ergebnisse erzielen können. Der Hauptunterschied liegt darin, wie der Zustand aufrechterhalten wird. In einer Klasse wird der Zustand als Instanzattribute gespeichert. In einem Closure wird der Zustand durch freie Variablen aufrechterhalten — Variablen, die nicht an den lokalen Bereich gebunden sind. Closures behalten die Bindung an freie Variablen, die beim Definieren der Funktion existieren.
Bei der Arbeit mit unveränderlichen Typen in Closures wird das Schlüsselwort nonlocal benötigt. Ohne es erstellt das erneute Zuweisen einer Variable innerhalb der verschachtelten Funktion eine neue lokale Variable, anstatt die eingeschlossene zu ändern. Das Schlüsselwort nonlocal macht eine Variable zu einer freien Variable und erlaubt das Ändern unveränderlicher Werte, die im Closure gespeichert sind.
Es gibt drei Anforderungen für ein Closure: eine verschachtelte Funktion, Zugriff auf eine freie Variable und die Rückgabe der verschachtelten Funktion. Closures sind nützlich, um die Verwendung globaler Variablen zur Datenversteckung zu reduzieren und einfache Funktionen zu implementieren. Für komplexere Aufgaben sind Klassen und OOP im Allgemeinen besser geeignet.
Das __closure__-Attribut kann verwendet werden, um auf Werte zuzugreifen, die von einem Closure eingeschlossen sind, und gibt ein Tupel von Zellobjekten zurück, deren cell_contents-Eigenschaft die gespeicherten Werte offenbart.