Gestores de contexto
Parte de la sección Object Oriented Programming del Journey de Python de Coddy — lección 41 de 64.
Los gestores de contexto permiten asignar y liberar recursos precisamente cuando es necesario. Aseguran una limpieza adecuada incluso si ocurren errores.
Aquí está el ejemplo más común usando la sentencia with:
with open('example.txt', 'w') as file:
file.write('Hello, world!')
# El archivo se cierra automáticamente aquíEl archivo se cierra automáticamente después del bloque, incluso si ocurre una excepción.
Crea tu propio gestor de contexto implementando los métodos __enter__ y __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 # No suprimir excepcionesUsa tu gestor de contexto personalizado:
with MyContext() as ctx:
print("Inside the context")Salida:
Entering the context
Inside the context
Exiting the contextCrea un administrador de contexto más práctico para conexiones de base de datos:
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...")Manejar excepciones en gestores de contexto:
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 # No suprimir la excepción
with SafeContext():
print("Working with resources")
# raise ValueError("Something went wrong") # Descomentar para probarSalida:
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 resourcesEl método __exit__ recibe tres parámetros:
exc_type: Tipo de excepción (o None)exc_val: Valor de la excepción (o None)exc_tb: Traceback de la excepción (o None)
Punto clave: Los gestores de contexto utilizan los métodos __enter__ y __exit__ para gestionar recursos. La sentencia with llama automáticamente a estos métodos, asegurando una configuración y limpieza adecuadas. Esto es especialmente útil para archivos, conexiones a bases de datos y otros recursos que requieren una limpieza garantizada.
Desafío
FácilEn este desafío, implementarás una clase de gestor de contexto que mide el tiempo transcurrido entre la entrada y la salida de un bloque de contexto.
timer.py- Contiene la implementación de la claseTimer(este es el archivo que editarás)driver.py- Contiene casos de prueba exhaustivos (no modificar)
Implementa el gestor de contexto Timer en timer.py siguiendo los comentarios TODO. La clase debe:
- Registrar el tiempo de inicio al entrar en un contexto
- Registrar el tiempo de finalización al salir
- Calcular y mostrar el tiempo transcurrido
Hoja de referencia
Los gestores de contexto asignan y liberan recursos precisamente cuando es necesario, asegurando una limpieza adecuada incluso si ocurren errores.
Utilice la sentencia with para la gestión automática de recursos:
with open('example.txt', 'w') as file:
file.write('Hello, world!')
# El archivo se cierra automáticamente aquíCree gestores de contexto personalizados implementando los métodos __enter__ y __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 # No suprimir excepciones
with MyContext() as ctx:
print("Inside the context")El método __exit__ recibe tres parámetros:
exc_type: Tipo de excepción (o None)exc_val: Valor de la excepción (o None)exc_tb: Traceback de la excepción (o None)
Maneje excepciones en los gestores de contexto:
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 # No suprimir la excepciónPruébalo tú mismo
from timer import Timer
import time
# Manejador de casos de prueba
test_case = input()
if test_case == "basic_test":
# Prueba de funcionalidad básica
with Timer():
# Simular algo de trabajo
time.sleep(2) # Esto hace que el programa espere 2 segundos
elif test_case == "nested_contexts":
# Probar gestores de contexto anidados
with Timer():
time.sleep(1)
with Timer():
time.sleep(1)
elif test_case == "exception_handling":
# Probar el manejo de excepciones dentro del contexto
try:
with Timer():
time.sleep(1)
raise ValueError("Test exception")
except ValueError as e:
print(f"Caught exception: {e}")
elif test_case == "zero_sleep":
# Probar con un tiempo de espera mínimo
with Timer():
time.sleep(0.001)
elif test_case == "multiple_timers":
# Probar múltiples temporizadores en secuencia
with Timer():
time.sleep(1)
with Timer():
time.sleep(0.5)
with Timer():
time.sleep(2)
elif test_case == "as_decorator":
# Probar el temporizador en el contexto de una función
def timed_function():
with Timer():
time.sleep(2)
timed_function()
else:
# Prueba por defecto - funcionalidad básica
with Timer():
# Simular algo de trabajo
time.sleep(2) # Esto hace que el programa espere 2 segundos
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Object Oriented Programming
1Fundamentos de la POO
Archivos externosIntroducción a la POOClases vs ObjetosEl parámetro selfMétodosAtributosMétodo constructor (__init__)Resumen - Calculadora simple4Herencia
Herencia básicaLa función super()Sobrescritura de métodosHerencia múltipleOrden de resolución de métodosResumen - Jerarquía de empleados7Métodos especiales
Introducción a los métodos mágicosSobrecarga de operadoresMétodos mágicos de contenedoresRepaso - Lista personalizada10Patrones de diseño Parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón ObserverPatrón Strategy2Decoradores
Introducción a los decoradoresDecorador propertyDecorador de métodos estáticosDecorador de métodos de clase5Polimorfismo
Sobreescritura de métodos revisitadaDuck TypingClases y métodos abstractosDiseño de interfacesResumen - Calculadora de figuras8Conceptos avanzados de POO
Composición vs. HerenciaMixinsMétodos estáticos y de claseDecoradores de claseGestores de contexto11Patrones de diseño, parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón Composite3Propiedades de clase
Variables de instancia vs de claseDecoradores de propiedadesAtributos privadosResumen - Gestor de cuentas bancarias