Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Impara Creazione di gestori di contesto personalizzati | Advanced File Handling & Context Managers
Programmazione Strutturale in Python

Creazione di gestori di contesto personalizzati

Scorri per mostrare il menu

Per sfruttare appieno la potenza dei context manager in Python, è possibile crearne di propri definendo una classe che implementa i metodi __enter__ e __exit__. Il metodo __enter__ viene chiamato quando l'esecuzione entra nel contesto dell'istruzione with, e il suo valore di ritorno viene assegnato alla variabile dopo as. Il metodo __exit__ viene invocato quando l'esecuzione esce dal contesto, sia che termini normalmente sia a causa di un'eccezione. Questa struttura consente di configurare e rilasciare risorse in modo sicuro e prevedibile, particolarmente utile per la gestione di file, connessioni di rete o lock.

Il metodo __exit__ riceve tre argomenti: exc_type, exc_value e traceback. Questi forniscono dettagli su eventuali eccezioni verificatesi all'interno del blocco contestuale. Se __exit__ restituisce True, l'eccezione viene soppressa; altrimenti, l'eccezione si propaga dopo la pulizia. Implementando questi metodi, è possibile controllare con precisione la logica di configurazione e rilascio delle risorse, rendendo il codice più robusto e manutenibile.

class FileLogger:
    def __init__(self, filename, logname):
        self.filename = filename
        self.logname = logname
        self.file = None
        self.log = None

    def __enter__(self):
        self.file = open(self.filename, "r")
        self.log = open(self.logname, "a")
        self.log.write(f"Opened file: {self.filename}\n")
        return self.file

    def __exit__(self, exc_type, exc_value, traceback):
        if self.file:
            self.file.close()
            self.log.write(f"Closed file: {self.filename}\n")
        if self.log:
            self.log.close()
        # Do not suppress exceptions
        return False

Il codice seguente mostra una classe context manager personalizzata FileLogger. Questa classe è progettata per aprire un file di destinazione in lettura e un file di log in modalità append per registrare le operazioni. All'ingresso nel contesto (utilizzando l'istruzione with), viene registrato l'evento di apertura del file. All'uscita dal contesto - sia per esecuzione normale sia per eccezione - viene registrato l'evento di chiusura del file e viene garantita la corretta chiusura di entrambi i file. Il metodo __exit__ non sopprime le eccezioni, permettendo loro di propagarsi dopo la pulizia.

question mark

Quale affermazione descrive meglio il ruolo del metodo __exit__ in un context manager personalizzato?

Seleziona la risposta corretta

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 2. Capitolo 5

Chieda ad AI

expand

Chieda ad AI

ChatGPT

Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione

Sezione 2. Capitolo 5
some-alt