Python Academy · leksjon

Praktiske mønstre for kontekstbehandlere

Bruk kontekstbehandlere for filer, låser, tidtakere og databaseforbindelser.

Leksjon 4 av 414 trinn

Praktiske mønstre for kontekstbehandlere er en gratis leksjon i Python Academy på CoddyKit. Dette er leksjon 4 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.

Innledning

Kontekstbehandlere løser praktiske problemer med ressursbehandling på en elegant måte for filer, databaser, låser, tidtakere og mye mer.

Filbehandlingspipeline

Åpne inndata- og utdatafiler samtidig, behandle dem linje for linje, og lukk begge automatisk.
import io
src = io.StringIO('line1\nline2\nline3')
dst = io.StringIO()
with src, dst:
    for line in src:
        dst.write(line.upper())
print(dst.getvalue())

Databasetransaksjon

Omslutt databaseoperasjoner i en kontekstbehandler: utfør commit ved suksess, rollback ved unntak, og lukk alltid.
from contextlib import contextmanager
@contextmanager
def db_transaction(conn):
    try:
        yield conn
        print('COMMIT')
    except Exception as e:
        print(f'ROLLBACK: {e}')
        raise
    finally:
        print('CLOSE')
with db_transaction({'execute': lambda q: print(f'SQL: {q}')}) as db:
    db['execute']('INSERT ...')

Trådlås

with lock: skaffer låsen, kjører innholdet og frigir låsen ved avslutning – De trenger ikke å kalle acquire/release manuelt.
import threading
lock = threading.Lock()
shared = []
def add(x):
    with lock:
        shared.append(x)
add(1); add(2)
print(shared)

Bytte arbeidskatalog

os.chdir() endrer arbeidskatalogen globalt. En kontekstbehandler lagrer og gjenoppretter den.
from contextlib import contextmanager
import os
@contextmanager
def chdir(path):
    old = os.getcwd()
    os.chdir(path)
    try: yield
    finally: os.chdir(old)
original = os.getcwd()
with chdir('/tmp'):
    print('in tmp:', os.getcwd())
print('back:', os.getcwd())

Midlertidige filer

tempfile.NamedTemporaryFile som kontekstbehandler oppretter og sletter en midlertidig fil automatisk.
import tempfile
with tempfile.NamedTemporaryFile(mode='w', suffix='.txt', delete=True) as f:
    f.write('temp data')
    print('temp file:', f.name)
print('deleted')

Oppdatering av miljøvariabel

Angi en miljøvariabel midlertidig for en test eller underprosess, og gjenopprett den deretter.
from contextlib import contextmanager
import os
@contextmanager
def env(**kwargs):
    old = {k: os.environ.get(k) for k in kwargs}
    os.environ.update({k:str(v) for k,v in kwargs.items()})
    try: yield
    finally:
        for k,v in old.items():
            if v is None: os.environ.pop(k,None)
            else: os.environ[k]=v
with env(DEBUG='1', LOG_LEVEL='DEBUG'):
    print(os.environ['DEBUG'])

Profileringsblokk

Omslutt en blokk med cProfile for å måle ytelsen i en kontekstbehandler.
from contextlib import contextmanager
import cProfile
@contextmanager
def profile():
    pr = cProfile.Profile()
    pr.enable()
    yield pr
    pr.disable()
with profile() as pr:
    sum(range(1000000))
print('profiled')

Nettverkssocket

Sockets implementerer kontekstbehandlerprotokollen: with socket.socket() as s: lukker socketen ved avslutning.
import socket
try:
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.settimeout(0.1)
        print('socket ready')
except Exception as e:
    print(f'socket: {e}')

Fange opp advarsler

warnings.catch_warnings() fanger opp advarsler som utløses inne i blokken, noe som er nyttig i tester.
import warnings
with warnings.catch_warnings(record=True) as w:
    warnings.simplefilter('always')
    warnings.warn('test warning')
print(len(w), w[0].category.__name__)

Kombinere mønstre

Kontekstbehandlere fra virkelige prosjekter kombinerer ofte flere mønstre: transaksjon, logging og tidsmåling i én gjenbrukbar komponent.
from contextlib import contextmanager
import time
@contextmanager
def timed_operation(name):
    print(f'[{name}] start')
    t0 = time.perf_counter()
    try:
        yield
        print(f'[{name}] done in {time.perf_counter()-t0:.4f}s')
    except Exception as e:
        print(f'[{name}] failed: {e}')
        raise
with timed_operation('loop'):
    sum(range(100000))

Kunnskapssjekk

Hvilken trådingsprimitiv implementerer kontekstbehandlerprotokollen for trygg samtidig tilgang?

Oppsummering

Mønstre for kontekstbehandlere: filpipelines, databasetransaksjoner, låser, katalogendringer, midlertidige filer, miljøoppdateringer og profilering. Bruk ExitStack for dynamiske ressursstabler.

Fortsett

Godt jobbet! Neste leksjon venter.
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 «Praktiske mønstre for kontekstbehandlere» gratis?

Ja – hele teksten i «Praktiske mønstre for kontekstbehandlere» 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 «Praktiske mønstre for kontekstbehandlere»?

Bruk kontekstbehandlere for filer, låser, tidtakere og databaseforbindelser. 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 4 av 4.

Hvor lang tid tar leksjonen «Praktiske mønstre for kontekstbehandlere»?

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