0Pricing
Python Academy · Lezione

Schemi pratici per i context manager

Applichi i context manager a file, lock, timer e connessioni al database.

Schemi pratici per i context manager è una lezione Python Academy gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Python Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Python Academy include 4 lezioni in totale.

Introduzione

I gestori di contesto risolvono in modo elegante i problemi reali di gestione delle risorse, ad esempio per file, database, lock, timer e molto altro.

Pipeline di elaborazione dei file

Apra insieme i file di input e di output, li elabori riga per riga e li chiuda entrambi automaticamente.
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())

Transazione del database

Racchiuda le operazioni sul database in un CM: esegua il commit in caso di successo, il rollback in caso di eccezione e chiuda sempre la connessione.
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 ...')

Lock per i thread

with lock: acquisisce il lock, esegue il corpo e lo rilascia all'uscita: non è necessario chiamare manualmente acquire/release.
import threading
lock = threading.Lock()
shared = []
def add(x):
    with lock:
        shared.append(x)
add(1); add(2)
print(shared)

Cambio della directory

os.chdir() modifica globalmente la directory di lavoro. Un CM la salva e la ripristina.
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())

File temporanei

tempfile.NamedTemporaryFile come CM crea ed elimina automaticamente un file temporaneo.
import tempfile
with tempfile.NamedTemporaryFile(mode='w', suffix='.txt', delete=True) as f:
    f.write('temp data')
    print('temp file:', f.name)
print('deleted')

Modifica di una variabile d'ambiente

Imposti temporaneamente una variabile d'ambiente per un test o un subprocess, quindi la ripristini.
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'])

Blocco di profilazione

Racchiuda un blocco con cProfile per misurarne le prestazioni all'interno di un 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')

Socket di rete

I socket implementano il protocollo CM: with socket.socket() as s: chiude il socket all'uscita.
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}')

Acquisizione degli avvisi

warnings.catch_warnings() acquisisce gli avvisi generati all'interno del blocco; è utile nei test.
import warnings
with warnings.catch_warnings(record=True) as w:
    warnings.simplefilter('always')
    warnings.warn('test warning')
print(len(w), w[0].category.__name__)

Combinazione dei pattern

I CM reali combinano spesso più pattern: transazione, logging e misurazione dei tempi in un unico componente riutilizzabile.
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))

Controllo rapido

Quale primitiva per il threading implementa il protocollo dei gestori di contesto per un accesso concorrente sicuro?

Riepilogo

Pattern dei gestori di contesto: pipeline di file, transazioni del database, lock, cambi di directory, file temporanei, modifiche alle variabili d'ambiente e profilazione. Utilizzi ExitStack per stack dinamici di risorse.

Continui

Ottimo lavoro! La lezione successiva La aspetta.

Domande Frequenti

La lezione «Schemi pratici per i context manager» è gratuita?

Sì — il testo completo di «Schemi pratici per i context manager» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Python Academy, passa a CoddyKit PRO. Il corso Python Academy include 4 lezioni in totale.

Cosa imparerò in «Schemi pratici per i context manager»?

Applichi i context manager a file, lock, timer e connessioni al database. Eserciti Python Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Python Academy?

Non è richiesta alcuna esperienza precedente. Python Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.

Quanto tempo richiede la lezione «Schemi pratici per i context manager»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Python Academy?

Sì. Ogni lezione Python Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. L'istruzione with in dettaglio
  2. Protocollo __enter__ e __exit__
  3. contextlib: @contextmanager
  4. Schemi pratici per i context manager
← Torna a Python Academy