Python Academy · Lektion

contextlib: @contextmanager

Skapa kontexthanterare koncist med contextlib-decoratoren.

Lektion 3 av 413 steg

contextlib: @contextmanager är en gratis lektion i Python Academy på CoddyKit. Detta är lektion 3 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.

Varför contextlib?

contextlib.contextmanager gör det möjligt att skriva en kontexthanterare som en generatorfunktion i stället för som en klass, vilket minskar mängden standardkod.

from contextlib import contextmanager

@contextmanager
def managed():
    print("setup")
    yield
    print("teardown")

with managed():
    print("inside")

Yielda ett värde

Det du än yield:ar binds till as-variabeln i with-satsen.

from contextlib import contextmanager

@contextmanager
def temp_list():
    lst = []
    yield lst
    print(f"Final list: {lst}")

with temp_list() as lst:
    lst.append(1)
    lst.append(2)

Undantagshantering i @contextmanager

Omslut yield med try/finally för att garantera städning även om ett undantag inträffar.

from contextlib import contextmanager

@contextmanager
def safe_open(path):
    f = open(path)
    try:
        yield f
    finally:
        f.close()

with safe_open("data.txt") as f:
    print(f.read())

Undertrycka undantag

Fånga undantaget inuti generatorn för att undertrycka det – det är samma sak som att returnera True från __exit__.

from contextlib import contextmanager

@contextmanager
def ignore_value_errors():
    try:
        yield
    except ValueError:
        pass

with ignore_value_errors():
    raise ValueError("ignored")

contextlib.suppress

contextlib.suppress(*exceptions) är en färdig kontexthanterare som undertrycker angivna undantagstyper.

from contextlib import suppress

with suppress(FileNotFoundError):
    open("missing.txt")

print("continues")

contextlib.closing

closing(obj) skapar en kontexthanterare som anropar obj.close() vid avslut. Användbart för objekt som har close() men saknar __exit__.

from contextlib import closing
from urllib.request import urlopen

with closing(urlopen("https://example.com")) as page:
    content = page.read()

contextlib.nullcontext

nullcontext är en kontexthanterare utan åtgärd. Användbar när en kontexthanterare är valfri.

from contextlib import nullcontext

def process(data, lock=None):
    cm = lock if lock is not None else nullcontext()
    with cm:
        return [x*2 for x in data]

contextlib.ExitStack

ExitStack låter dig hantera ett varierande antal kontexthanterare dynamiskt.

from contextlib import ExitStack

files = ["a.txt", "b.txt", "c.txt"]
with ExitStack() as stack:
    handles = [stack.enter_context(open(f)) for f in files]
    data = [h.read() for h in handles]

Återanvända en @contextmanager

En generatorbaserad kontexthanterare kan användas en gång per anrop. Anropa den dekorerade funktionen igen för att återanvända den.

from contextlib import contextmanager

@contextmanager
def counter():
    count = 0
    yield lambda: count.__add__  # each call is independent
    print("done")

with counter():
    pass
with counter():
    pass

asynccontextmanager

För asynkron kod använder du contextlib.asynccontextmanager för att skriva async with-hanterare som generatorer.

from contextlib import asynccontextmanager

@asynccontextmanager
async def async_session():
    session = await create_session()
    try:
        yield session
    finally:
        await session.close()

contextlib.redirect_stdout

Omdirigera standardutdata till valfritt filliknande objekt tillfälligt.

import io
from contextlib import redirect_stdout

buf = io.StringIO()
with redirect_stdout(buf):
    print("captured")

print(buf.getvalue())  # captured

Snabbkontroll

I en @contextmanager-generator, var ska städkoden placeras för att garantera att den körs även vid ett undantag?

Sammanfattning

@contextmanager omvandlar en generator till en kontexthanterare. Använd try/finally runt yield för säker städning. Modulen contextlib tillhandahåller även suppress, nullcontext, ExitStack med mera.

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 ”contextlib: @contextmanager” gratis?

Ja – hela texten till ”contextlib: @contextmanager” 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 ”contextlib: @contextmanager”?

Skapa kontexthanterare koncist med contextlib-decoratoren. 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 3 av 4.

Hur lång tid tar lektionen ”contextlib: @contextmanager”?

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