Skip to main content
idego

Bakom kulisserna på Python-closure-funktionen

Av Idego Group

Bakom kulisserna på Python-closure-funktionen

I den här artikeln lär vi oss vad ett Python-closure är, hur man använder det och vad det kan användas till. Vi förklarar också extra termer som nonlocal och fria variabler, vad ett variabelomfång är och vad nästlade och förstklassiga funktioner är.

Ett closure är en teknik för att implementera lexikalt begränsad nambbindning i ett språk med förstklassiga funktioner. Operativt sett är ett closure ett register som lagrar en funktion tillsammans med en miljö. Miljön är en mappning som associerar varje fri variabel i funktionen med värdet eller referensen som namnet var bundet till när closuret skapades.

En funktion som är definierad inuti en annan funktion kallas en nästlad funktion. I Python kan variabeln nås inifrån det omfång den skapades i. Funktioner i Python är förstklassiga funktioner, vilket innebär att de kan behandlas som objekt — skickas som argument, tilldelas eller returneras.

Ett closure-exempel jämfört med ett klassbaserat tillvägagångssätt visar att båda kan uppnå liknande resultat. Den viktigaste skillnaden är hur tillståndet upprätthålls. I en klass lagras tillståndet som instansattribut. I ett closure upprätthålls tillståndet genom fria variabler — variabler som inte är bundna till det lokala omfånget. Closures behåller bindningen till fria variabler som existerar när funktionen definieras.

Vid arbete med oföränderliga typer i closures behövs nyckelordet nonlocal. Utan det skapar omtilldelning av en variabel inuti den nästlade funktionen en ny lokal variabel istället för att modifiera den inneslutna. Nyckelordet nonlocal gör en variabel till en fri variabel och tillåter ändring av oföränderliga värden lagrade i closuret.

Det finns tre krav för att skapa ett closure: en nästlad funktion, tillgång till en fri variabel och att returnera den nästlade funktionen. Closures är användbara när man vill minska användningen av globala variabler för att dölja data och när man implementerar enkla funktioner. För mer komplexa uppgifter är klasser och OOP generellt bättre.

Attributet __closure__ kan användas för att komma åt värden som omsluts av ett closure och returnerar en tupel av cellobjekt vars cell_contents-egenskap avslöjar de lagrade värdena.

Relaterade artiklar