Context manager
Fa parte della sezione Programmazione orientata agli oggetti del percorso Python di Coddy. Lezione 41 di 64.
I gestori di contesto ti permettono di allocare e rilasciare risorse esattamente quando serve. Garantiscono una corretta pulizia anche se si verificano errori.
Ecco l'esempio più comune che utilizza l'istruzione with:
with open('example.txt', 'w') as file:
file.write('Hello, world!')
# Il file viene chiuso automaticamente quiIl file viene chiuso automaticamente dopo il blocco, anche se si verifica un'eccezione.
Crea il tuo gestore di contesto implementando i metodi __enter__ e __exit__:
class MyContext:
def __enter__(self):
print("Entering the context")
return self
def __exit__(self, exc_type, exc_val, exc_tb):
print("Exiting the context")
return False # Non sopprimere le eccezioniUsa il tuo gestore di contesto personalizzato:
with MyContext() as ctx:
print("Inside the context")Output:
Entering the context
Inside the context
Exiting the contextCrea un gestore di contesto più pratico per le connessioni al database:
class DatabaseConnection:
def __init__(self, db_name):
self.db_name = db_name
self.connection = None
def __enter__(self):
print(f"Connecting to {self.db_name}")
self.connection = f"Connection to {self.db_name}"
return self.connection
def __exit__(self, exc_type, exc_val, exc_tb):
print(f"Closing connection to {self.db_name}")
self.connection = None
with DatabaseConnection("users_db") as conn:
print(f"Using {conn}")
print("Performing database operations...")Gestire le eccezioni nei gestori di contesto:
class SafeContext:
def __enter__(self):
print("Setting up resources")
return self
def __exit__(self, exc_type, exc_val, exc_tb):
print("Cleaning up resources")
if exc_type:
print(f"An exception occurred: {exc_val}")
return False # Non sopprimere l'eccezione
with SafeContext():
print("Working with resources")
# raise ValueError("Something went wrong") # Rimuovi il commento per fare una provaOutput:
Connecting to users_db
Using Connection to users_db
Performing database operations...
Closing connection to users_db
Setting up resources
Working with resources
Cleaning up resourcesIl metodo __exit__ riceve tre parametri:
exc_type: tipo di eccezione (o None)exc_val: valore dell'eccezione (o None)exc_tb: traceback dell'eccezione (o None)
Punto chiave: i gestori di contesto usano i metodi __enter__ e __exit__ per gestire le risorse. L'istruzione with chiama automaticamente questi metodi, garantendo una corretta configurazione e pulizia. Questo è particolarmente utile per i file, le connessioni al database e altre risorse che richiedono una pulizia garantita.
Sfida
FacileIn questa sfida, implementerai una classe gestore di contesto che misura il tempo trascorso tra l'ingresso e l'uscita da un blocco di contesto.
timer.py- Contiene l'implementazione della classeTimer(questo è il file che modificherai)driver.py- Contiene casi di test completi (non modificare)
Implementa il gestore di contesto Timer in timer.py seguendo i commenti TODO. La classe deve:
- Registrare l'ora di inizio quando si entra in un contesto
- Registrare l'ora di fine quando si esce
- Calcolare e visualizzare il tempo trascorso
Provalo tu
from timer import Timer
import time
# Gestore dei casi di test
test_case = input()
if test_case == "basic_test":
# Test delle funzionalità di base
with Timer():
# Simula un po' di lavoro
time.sleep(2) # Questo fa attendere il programma per 2 secondi
elif test_case == "nested_contexts":
# Test dei gestori di contesto annidati
with Timer():
time.sleep(1)
with Timer():
time.sleep(1)
elif test_case == "exception_handling":
# Test della gestione delle eccezioni all'interno del contesto
try:
with Timer():
time.sleep(1)
raise ValueError("Test exception")
except ValueError as e:
print(f"Caught exception: {e}")
elif test_case == "zero_sleep":
# Test con una pausa minima
with Timer():
time.sleep(0.001)
elif test_case == "multiple_timers":
# Test di più timer in sequenza
with Timer():
time.sleep(1)
with Timer():
time.sleep(0.5)
with Timer():
time.sleep(2)
elif test_case == "as_decorator":
# Test del timer nel contesto di una funzione
def timed_function():
with Timer():
time.sleep(2)
timed_function()
else:
# Test predefinito - funzionalità di base
with Timer():
# Simula un po' di lavoro
time.sleep(2) # Questo fa attendere il programma per 2 secondi
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti di OOP
File esterniIntroduzione a OOPClassi vs. oggettiIl parametro selfMetodiAttributiMetodo costruttore (__init__)Riepilogo - Calcolatrice semplice4Ereditarietà
Ereditarietà di baseLa funzione super()Sovrascrittura dei metodiEreditarietà multiplaOrdine di risoluzione dei metodiRiepilogo - Gerarchia dei dipendenti7Metodi speciali
Introduzione ai metodi magiciSovraccarico degli operatoriMetodi magici dei contenitoriRiepilogo - Lista personalizzata10Modelli di progettazione Parte 1
Introduzione ai modelli di progettazioneModello SingletonModello FactoryModello ObserverModello Strategy2Decoratori
Introduzione ai decoratoriDecoratore di proprietàDecoratore di metodo staticoDecoratore di metodo di classe5Polimorfismo
Ripasso dell'override dei metodiDuck typingClassi e metodi astrattiProgettazione delle interfacceRiepilogo - Calcolatore di forme8Concetti avanzati di OOP
Composizione vs ereditarietàMixinMetodi statici e di classeDecorator di classeContext manager11Pattern di progettazione - Parte 2
Pattern dei comandiPattern adattatorePattern decoratorePattern metodo templatePattern statoPattern composito3Proprietà delle classi
Variabili di istanza e di classeDecorator delle proprietàAttributi privatiRiepilogo - Gestore di conti bancari6Incapsulamento
Membri pubblici, protetti e privatiModificatori di accessoOccultamento delle informazioniDecorator delle proprietà: avanzatiRipasso - Sistema di registri degli studenti12Progetto: Gestione della biblioteca
Panoramica del progettoClassi Libro e UtenteSistema di prestitoFunzionalità di ricercaInterfaccia amministratoreTest e integrazioneEsercitati da solo: Compilatore Python online