Els gestors de context són una característica poderosa de Python que permet gestionar recursos de manera eficient i segura. S'utilitzen principalment per assegurar-se que els recursos com fitxers, connexions de xarxa, etc., es tanquin correctament després d'haver estat utilitzats, independentment de si s'ha produït una excepció o no.
Continguts
- Què és un gestor de context?
- Utilitzant
withper gestionar recursos - Creació de gestors de context personalitzats
- La classe
contextlib.ContextDecorator - Exemples pràctics
- Exercicis
- Què és un gestor de context?
Un gestor de context és un objecte que defineix els mètodes __enter__ i __exit__. Aquests mètodes permeten inicialitzar i netejar recursos respectivament.
__enter__(self): S'executa quan el bloc de codi dins del gestor de context comença.__exit__(self, exc_type, exc_value, traceback): S'executa quan el bloc de codi dins del gestor de context acaba, independentment de si s'ha produït una excepció o no.
- Utilitzant
with per gestionar recursos
with per gestionar recursosLa manera més comuna d'utilitzar un gestor de context és amb la declaració with. Aquesta declaració garanteix que els recursos es gestionin correctament.
Exemple bàsic: Obrir i tancar fitxers
En aquest exemple:
open('example.txt', 'r')retorna un objecte de fitxer.__enter__obre el fitxer i retorna l'objecte de fitxer.__exit__tanca el fitxer automàticament quan surt del blocwith.
- Creació de gestors de context personalitzats
Podem crear els nostres propis gestors de context definint les classes amb els mètodes __enter__ i __exit__.
Exemple: Gestor de context personalitzat
class MyContextManager:
def __enter__(self):
print("Entering the context")
return self
def __exit__(self, exc_type, exc_value, traceback):
print("Exiting the context")
if exc_type:
print(f"An exception occurred: {exc_value}")
return True # Evita que l'excepció es propagui
with MyContextManager() as manager:
print("Inside the context")
raise ValueError("Something went wrong")Sortida:
Entering the context Inside the context Exiting the context An exception occurred: Something went wrong
- La classe
contextlib.ContextDecorator
contextlib.ContextDecoratorEl mòdul contextlib proporciona utilitats per treballar amb gestors de context. Una d'aquestes utilitats és ContextDecorator, que permet utilitzar gestors de context com a decoradors.
Exemple: Utilitzant ContextDecorator
from contextlib import ContextDecorator
class MyContextDecorator(ContextDecorator):
def __enter__(self):
print("Entering the context")
return self
def __exit__(self, exc_type, exc_value, traceback):
print("Exiting the context")
if exc_type:
print(f"An exception occurred: {exc_value}")
return True
@MyContextDecorator()
def my_function():
print("Inside the function")
raise ValueError("Something went wrong")
my_function()Sortida:
Entering the context Inside the function Exiting the context An exception occurred: Something went wrong
- Exemples pràctics
Exemple 1: Gestió de connexions de base de dades
class DatabaseConnection:
def __enter__(self):
print("Connecting to the database")
self.connection = "Database connection"
return self.connection
def __exit__(self, exc_type, exc_value, traceback):
print("Closing the database connection")
self.connection = None
with DatabaseConnection() as conn:
print(f"Using {conn}")Sortida:
Exemple 2: Temporització de blocs de codi
import time
class Timer:
def __enter__(self):
self.start = time.time()
return self
def __exit__(self, exc_type, exc_value, traceback):
self.end = time.time()
self.interval = self.end - self.start
print(f"Elapsed time: {self.interval:.2f} seconds")
with Timer():
time.sleep(2)Sortida:
- Exercicis
Exercici 1: Gestor de context per a fitxers temporals
Crea un gestor de context que creï un fitxer temporal, escrigui algunes dades i després l'esborri quan surti del context.
import os
import tempfile
class TempFile:
def __enter__(self):
self.file = tempfile.NamedTemporaryFile(delete=False)
return self.file
def __exit__(self, exc_type, exc_value, traceback):
self.file.close()
os.remove(self.file.name)
with TempFile() as temp_file:
temp_file.write(b"Hello, World!")
temp_file.seek(0)
print(temp_file.read())Exercici 2: Gestor de context per a la temporització de funcions
Crea un decorador que mesuri el temps d'execució d'una funció utilitzant ContextDecorator.
from contextlib import ContextDecorator
import time
class Timer(ContextDecorator):
def __enter__(self):
self.start = time.time()
return self
def __exit__(self, exc_type, exc_value, traceback):
self.end = time.time()
self.interval = self.end - self.start
print(f"Elapsed time: {self.interval:.2f} seconds")
@Timer()
def slow_function():
time.sleep(3)
slow_function()Resum
En aquesta secció, hem après què són els gestors de context i com utilitzar-los per gestionar recursos de manera eficient. Hem vist com crear gestors de context personalitzats i com utilitzar ContextDecorator per aplicar gestors de context com a decoradors. També hem treballat amb exemples pràctics i exercicis per reforçar els conceptes apresos.
Curs de Programació en Python
Mòdul 1: Introducció a Python
- Introducció a Python
- Configuració de l'Entorn de Desenvolupament
- Sintaxi de Python i Tipus de Dades Bàsics
- Variables i Constants
- Entrada i Sortida Bàsiques
Mòdul 2: Estructures de Control
Mòdul 3: Funcions i Mòduls
- Definició de Funcions
- Arguments de Funció
- Funcions Lambda
- Mòduls i Paquets
- Visió General de la Biblioteca Estàndard
Mòdul 4: Estructures de Dades
Mòdul 5: Programació Orientada a Objectes
Mòdul 6: Gestió de Fitxers
- Lectura i Escriptura de Fitxers
- Treballant amb Fitxers CSV
- Gestió de Dades JSON
- Operacions amb Fitxers i Directoris
Mòdul 7: Gestió d'Errors i Excepcions
Mòdul 8: Temes Avançats
- Decoradors
- Generadors
- Gestors de Context
- Concurrència: Fils i Processos
- Asyncio per a Programació Asíncrona
Mòdul 9: Proves i Depuració
- Introducció a les Proves
- Proves Unitàries amb unittest
- Desenvolupament Guiat per Proves
- Tècniques de Depuració
- Ús de pdb per a la Depuració
Mòdul 10: Desenvolupament Web amb Python
- Introducció al Desenvolupament Web
- Conceptes Bàsics del Framework Flask
- Construcció d'APIs REST amb Flask
- Introducció a Django
- Construcció d'Aplicacions Web amb Django
Mòdul 11: Ciència de Dades amb Python
- Introducció a la Ciència de Dades
- NumPy per al Càlcul Numèric
- Pandas per a la Manipulació de Dades
- Matplotlib per a la Visualització de Dades
- Introducció al Machine Learning amb scikit-learn
