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.
Grazie per i tuoi commenti!
Chieda ad AI
Chieda ad AI
Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione