Citat:
Ursprungligen postat av
Dinero
Är bara att jag inte har kommit till den biten med att förstå/bruka with statements än.
Syftet med dem är att det är något i slutet på dem som "måste" göras, och då ser with-statement till att detta görs automatiskt. Det enklaste exemplet är en fil. Den behöver öppnas, läsas från (eller skrivas till) och sedan stängas. Det kan göras på två olika sätt:
Kod:
f = open('fil.txt')
data = f.read()
f.close()
eller
Kod:
with open('fil.txt') as f:
data = f.read()
De två ovanstående blocken är i normalfallet helt ekvivalenta men det andra är en rad kortare, vilket är smidigt.
close() kommer anropas automatiskt i filen när
with-blocket avslutas.
Det som skiljer dem åt funktionsmässigt är att om det kastas ett undantag mellan
open och
close i det första blocket, så kommer
close-anropet aldrig göras, och filen kan i teorin vara öppen till programmet avslutas (detta är helt klart en sanning med modifikation, men förenklat, och i teorin så är det så). Det är ett slöseri med resurser (öppna filhandtag) som i sin tur kan bli ett problem i ett stort och komplicerat program.
I ditt exempel med Tor ovan är circuits (som jag helt ärligt inte vet riktigt vad det är) och streams också objekt som behöver ha lite uppstädning gjorda i sig när man är färdig med dem. Så alternativet till att använda with-satser är då att anropa
close() eller något liknande i slutet på funktionen. Men då har du åter igen samma problem som med filen, i händelse av att det kastas ett undantag.