Python Academy · leksjon

contextlib: @contextmanager

Opprett kontekstbehandlere på en konsis måte med contextlib-decoratoren.

Leksjon 3 av 413 trinn

contextlib: @contextmanager er en gratis leksjon i Python Academy på CoddyKit. Dette er leksjon 3 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Python Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Python Academy inneholder totalt 4 leksjoner.

Hvorfor contextlib?

contextlib.contextmanager lar Dem skrive en kontekstbehandler som en generatorfunksjon i stedet for en klasse, slik at De unngår mye standardkode.

from contextlib import contextmanager

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

with managed():
    print("inside")

Å returnere en verdi

Det De yield-er, bindes til as-variabelen i with-setningen.

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)

Unntakshåndtering i @contextmanager

Omslutt yield med try/finally for å garantere opprydding selv om det oppstår et unntak.

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())

Undertrykking av unntak

Fang opp unntaket inne i generatoren for å undertrykke det – det tilsvarer å returnere True fra __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) er en ferdig kontekstbehandler som undertrykker angitte unntakstyper.

from contextlib import suppress

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

print("continues")

contextlib.closing

closing(obj) oppretter en kontekstbehandler som kaller obj.close() ved avslutning. Dette er nyttig for objekter som har close(), men ikke __exit__.

from contextlib import closing
from urllib.request import urlopen

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

contextlib.nullcontext

nullcontext er en kontekstbehandler som ikke gjør noe. Den er nyttig når en kontekstbehandler er valgfri.

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 lar Dem håndtere et variabelt antall kontekstbehandlere dynamisk.

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]

Gjenbruk av en @contextmanager

En generatorbasert kontekstbehandler kan bare brukes én gang per kall. Kall den dekorerte funksjonen på nytt for å bruke den igjen.

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

For asynkron kode kan De bruke contextlib.asynccontextmanager til å skrive async with-behandlere 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

Omdiriger standardutdata midlertidig til et vilkårlig filaktig objekt.

import io
from contextlib import redirect_stdout

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

print(buf.getvalue())  # captured

Kunnskapssjekk

I en @contextmanager-generator: hvor bør oppryddingskoden plasseres for å garantere at den kjøres selv ved unntak?

Oppsummering

@contextmanager gjør en generator om til en kontekstbehandler. Bruk try/finally rundt yield for sikker opprydding. contextlib-modulen tilbyr også suppress, nullcontext, ExitStack og mer.

Gratis å komme i gang

Lær deg Python med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
76
Leksjoner
320

Ofte stilte spørsmål

Er leksjonen «contextlib: @contextmanager» gratis?

Ja – hele teksten i «contextlib: @contextmanager» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Python Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Python Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «contextlib: @contextmanager»?

Opprett kontekstbehandlere på en konsis måte med contextlib-decoratoren. Du øver på Python Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Python Academy?

Ingen tidligere erfaring er nødvendig. Python Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 3 av 4.

Hvor lang tid tar leksjonen «contextlib: @contextmanager»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Python Academy-leksjonen?

Ja. Alle Python Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. with-setningen i dybden
  2. __enter__- og __exit__-protokollen
  3. contextlib: @contextmanager
  4. Praktiske mønstre for kontekstbehandlere
← Tilbake til Python Academy