Python Academy · Lektion

Praktiska mönster för kontexthanterare

Använd kontexthanterare för filer, lås, timers och databasanslutningar.

Lektion 4 av 414 steg

Praktiska mönster för kontexthanterare är en gratis lektion i Python Academy på CoddyKit. Detta är lektion 4 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.

Introduktion

Kontexthanterare löser elegant verkliga problem med resurshantering för filer, databaser, lås, tidtagare och mycket mer.

Filbearbetningspipeline

Öppna in- och utdatafilerna tillsammans, bearbeta dem rad för rad och stäng båda automatiskt.
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())

Databastransaktion

Omslut databasoperationer i en CM: gör commit vid lyckat resultat, rollback vid undantag och stäng 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: hämtar låset, kör blocket och släpper det vid avslut – ingen manuell acquire/release behövs.
import threading
lock = threading.Lock()
shared = []
def add(x):
    with lock:
        shared.append(x)
add(1); add(2)
print(shared)

Byta katalog

os.chdir() ändrar arbetskatalogen globalt. En CM sparar och återställer 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())

Tillfälliga filer

tempfile.NamedTemporaryFile som en CM skapar och tar automatiskt bort en temporär fil.
import tempfile
with tempfile.NamedTemporaryFile(mode='w', suffix='.txt', delete=True) as f:
    f.write('temp data')
    print('temp file:', f.name)
print('deleted')

Ändra miljövariabel

Ange tillfälligt en miljövariabel för ett test eller en underprocess och återställ den sedan.
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'])

Profileringsblock

Omslut ett block med cProfile för att mäta dess prestanda inuti en CM.
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')

Nätverkssocket

Sockets implementerar CM-protokollet: with socket.socket() as s: stänger socketen vid avslut.
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}')

Fånga varningar

warnings.catch_warnings() fångar varningar som genereras inuti blocket, vilket är användbart 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__)

Kombinera mönster

Verkliga CM:er kombinerar ofta flera mönster: transaktion, loggning och tidtagning i en återanvändbar 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))

Snabbkontroll

Vilken trådningsprimitiv implementerar kontexthanterarprotokollet för säker samtidig åtkomst?

Sammanfattning

Mönster för kontexthanterare: filpipelines, databastransaktioner, lås, katalogbyten, temporära filer, miljövariabeländringar och profilering. ExitStack för dynamiska resurshierarkier.

Fortsätt

Bra jobbat! Nästa lektion väntar.
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 ”Praktiska mönster för kontexthanterare” gratis?

Ja – hela texten till ”Praktiska mönster för kontexthanterare” 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 ”Praktiska mönster för kontexthanterare”?

Använd kontexthanterare för filer, lås, timers och databasanslutningar. 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 4 av 4.

Hur lång tid tar lektionen ”Praktiska mönster för kontexthanterare”?

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