Come utilizzare i gestori di contesto in Python (con istruzione)

Scopri come funzionano i gestori di contesto in Python. Padroneggia l'istruzione with, gestisci le risorse di sistema e scrivi gestori di contesto personalizzati.

Prova questa soluzione nell'editor

Panoramica

La gestione corretta delle risorse esterne, ad esempio la chiusura degli handle di file, la disconnessione delle connessioni al database e il rilascio dei thread lock, è essenziale per creare software affidabile e pronto per la produzione. Il mancato rilascio delle risorse può causare perdite di memoria, errori di blocco dei file e blocchi dell'applicazione.

L'istruzione `with` di Python semplifica la pulizia delle risorse creando un gestore di contesto. Un gestore di contesto garantisce che le azioni di pulizia vengano eseguite automaticamente quando il controllo lascia il blocco, anche se il codice genera un'eccezione o esce in anticipo. Ciò elimina la necessità di blocchi "provare finalmente" dettagliati e ripetitivi.

Sebbene i gestori di contesto siano più comunemente associati a operazioni integrate come "open()", puoi facilmente progettare i tuoi gestori di contesto personalizzati. Puoi costruirli creando una classe che implementa i metodi magici `__enter__` e `__exit__`, o scrivendo una funzione generatrice decorata con il decoratore `contextlib.contextmanager`.

Codice e output di esecuzione

Questo script dimostra la scrittura di gestori di contesto personalizzati in Python utilizzando implementazioni di classi e decoratori contextlib.

context_managers.py
Prova nell'editor
from contextlib import contextmanager

# Method 1: Class-based context manager
class CustomResource:
    def __enter__(self):
        print("[Resource] Opening connection...")
        return self

    def do_work(self):
        print("[Resource] Performing action...")

    def __exit__(self, exc_type, exc_val, exc_tb):
        print("[Resource] Closing connection safely.")
        return False

print("--- Class Context Manager ---")
with CustomResource() as resource:
    resource.do_work()

# Method 2: Generator-based context manager (contextlib)
@contextmanager
def simple_timer():
    print("\n[Timer] Started...")
    try:
        yield
    finally:
        print("[Timer] Finished!")

print("\n--- Decorator Context Manager ---")
with simple_timer():
    print("Performing tasks inside context...")
Uscita terminale
--- Class Context Manager ---
[Resource] Opening connection...
[Resource] Performing action...
[Resource] Closing connection safely.

--- Decorator Context Manager ---

[Timer] Started...
Performing tasks inside context...
[Timer] Finished!

Implementazione passo dopo passo

  • Utilizzare l'istruzione with quando si aprono file, database o blocchi per garantire la sicurezza delle risorse.
  • Definisci gestori di contesto personalizzati utilizzando classi con metodi magici __enter__ e __exit__.
  • Utilizzare il decoratore @contextlib.contextmanager su una funzione generatrice come alternativa più semplice e basata su funzioni.
  • Posiziona le azioni di chiusura delle risorse all'interno del blocco di pulizia per assicurarti che vengano eseguite anche se si verificano errori.

Domande frequenti

Quali parametri riceve il metodo __exit__?

Il metodo __exit__ riceve tre argomenti che rappresentano i dettagli dell'eccezione se ne è stata sollevata una: exc_type (tipo di eccezione), exc_val (valore dell'eccezione) e exc_tb (traceback). Se non si è verificato alcun errore, tutti e tre vengono passati come None.

Un gestore di contesto può sopprimere le eccezioni?

Sì. Se il metodo __exit__ restituisce un valore di verità (come True), Python sopprime l'eccezione e l'esecuzione continua dopo il blocco with. Se restituisce False, l'eccezione viene sollevata normalmente.

Argomenti correlati

Risorse Python consigliate

Espandi le tue conoscenze con tutorial interattivi, foglietti illustrativi e confronti di codici correlati.