Python Academy · Lektion

with-satsen på djupet

Förstå hur with fungerar och varför den förhindrar resursläckor.

Lektion 1 av 414 steg

with-satsen på djupet är en gratis lektion i Python Academy på CoddyKit. Detta är lektion 1 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för Python Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Python Academy innehåller totalt 4 lektioner.

Introduktion

with-satsen garanterar att kod för initiering och städning körs, även när undantag uppstår.

Grundläggande användning av with

with expr as var: – expr måste returnera en kontexthanterare. var binds till det som __enter__ returnerar.
with open('/tmp/cm_test.txt','w') as f:
    f.write('hello')
print('file closed:', f.closed)

Varför with finns

Resurser som filer, lås och databasanslutningar måste frigöras. with garanterar städning även om ett undantag avbryter blocket.
# Without with:
# f = open('f.txt')
# try: ...
# finally: f.close()
# With with:
# with open('f.txt') as f: ...
print('with is cleaner')

Flera kontexthanterare

with open(a) as f, open(b) as g: öppnar två resurser i en sats. Båda stängs när satsen avslutas.
import tempfile, os
a = tempfile.mktemp(); b = tempfile.mktemp()
with open(a,'w') as fa, open(b,'w') as fb:
    fa.write('A'); fb.write('B')
os.unlink(a); os.unlink(b)
print('both closed')

with undertrycker inte undantag

Som standard sprids undantag i with-blocket vidare. __exit__ kan undertrycka dem genom att returnera True.
try:
    with open('/nonexistent.txt') as f:
        pass
except FileNotFoundError as e:
    print('caught:', e)

Lås som kontexthanterare

threading.Lock() fungerar som en kontexthanterare: with lock: säkerställer att låset alltid frigörs.
import threading
lock = threading.Lock()
with lock:
    print('locked section')
print('lock released')

Mönster för databasanslutning

En databasanslutning som kontexthanterare gör commit vid lyckat resultat och rollback vid undantag – ett viktigt mönster.
# Typical DB pattern:
# with db.transaction() as conn:
#     conn.execute(sql)
# commits on success, rolls back on exception
print('db pattern demo')

Nästad with-satser

Nästad with-satser går bra. Den inre kontexthanteraren avslutas först, därefter den yttre.
import tempfile
tmp = tempfile.mktemp()
with open(tmp,'w') as outer:
    with open(tmp,'r+') as inner:
        outer.write('x')
import os; os.unlink(tmp)
print('nested exit order')

contextlib.suppress

contextlib.suppress(ExcType) ignorerar tyst en specifik undantagstyp i with-blocket.
from contextlib import suppress
with suppress(FileNotFoundError):
    open('/does/not/exist.txt')
print('no error raised')

contextlib.redirect_stdout

contextlib.redirect_stdout(f) omdirigerar utskrifter från print() till f under en begränsad tid.
from contextlib import redirect_stdout
import io
buf = io.StringIO()
with redirect_stdout(buf):
    print('captured')
print('got:', buf.getvalue())

ExitStack

contextlib.ExitStack hanterar ett dynamiskt antal kontexthanterare – användbart när Ni inte vet hur många filer som ska öppnas.
from contextlib import ExitStack
import tempfile, os
with ExitStack() as stack:
    files = [stack.enter_context(open(tempfile.mktemp(),'w')) for _ in range(3)]
    for f in files: f.write('x')
print('all closed')

Snabb kontroll

Vad gör contextlib.suppress(FileNotFoundError)?

Sammanfattning

with garanterar städning. Flera mål i en with-sats. contextlib.suppress tystar specifika fel. ExitStack hanterar dynamiska antal kontexthanterare.

Fortsätt

Utmärkt arbete! Nästa lektion väntar.
Gratis att börja

Lär dig Python med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
76
Lektioner
320

Vanliga frågor

Är lektionen ”with-satsen på djupet” gratis?

Ja – hela texten till ”with-satsen på djupet” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i Python Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i Python Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”with-satsen på djupet”?

Förstå hur with fungerar och varför den förhindrar resursläckor. Ni övar på Python Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig Python Academy?

Du behöver inga förkunskaper. Utbildningen i Python Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 1 av 4.

Hur lång tid tar lektionen ”with-satsen på djupet”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här Python Academy-lektionen?

Ja. Varje Python Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. with-satsen på djupet
  2. Protokollet __enter__ och __exit__
  3. contextlib: @contextmanager
  4. Praktiska mönster för kontexthanterare
← Tillbaka till Python Academy