contextlib: @contextmanager
Opprett kontekstbehandlere på en konsis måte med contextlib-decoratoren.
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():
passasynccontextmanager
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()) # capturedKunnskapssjekk
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.
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
- with-setningen i dybden
- __enter__- og __exit__-protokollen
- contextlib: @contextmanager
- Praktiske mønstre for kontekstbehandlere