contextlib: @contextmanager
Skapa kontexthanterare koncist med contextlib-decoratoren.
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():
passasynccontextmanager
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()) # capturedSnabbkontroll
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.
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
- with-satsen på djupet
- Protokollet __enter__ och __exit__
- contextlib: @contextmanager
- Praktiska mönster för kontexthanterare