Puedes ejecutar cualquier ejemplo en nuestra consola interactiva: Abrir consola de Python →
Context Managers avanzados en Python
Los context managers permiten controlar recursos de forma segura y automática. En esta guía aprenderás a crear context managers personalizados, usar contextlib, manejar excepciones dentro del contexto y aplicar patrones profesionales usados en sistemas de archivos, conexiones de red y operaciones críticas.
Tabla de contenidos
- ¿Qué es un context manager?
- Context managers con clases
- Context managers con contextlib
- contextlib.contextmanager
- Manejo de excepciones dentro del contexto
- Context managers anidados
- Ejercicios
- Mini‑proyecto
1. ¿Qué es un context manager?
Un context manager controla la entrada y salida de un bloque with.
Implementa dos métodos:
- __enter__(): inicializa el recurso
- __exit__(): libera el recurso
class Archivo:
def __init__(self, ruta):
self.ruta = ruta
def __enter__(self):
self.f = open(self.ruta, "w")
return self.f
def __exit__(self, tipo, valor, traza):
self.f.close()
with Archivo("salida.txt") as f:
f.write("Hola mundo")
2. Context managers con clases
class Temporizador:
def __enter__(self):
import time
self.inicio = time.time()
return self
def __exit__(self, tipo, valor, traza):
import time
print("Tiempo:", time.time() - self.inicio)
with Temporizador():
suma = sum(range(1000000))
3. Context managers con contextlib
from contextlib import closing
import urllib.request
with closing(urllib.request.urlopen("https://example.com")) as pagina:
print(pagina.read())
4. contextlib.contextmanager
Permite crear context managers usando funciones y yield.
from contextlib import contextmanager
@contextmanager
def abrir(ruta):
f = open(ruta)
try:
yield f
finally:
f.close()
with abrir("archivo.txt") as f:
print(f.read())
5. Manejo de excepciones dentro del contexto
class Gestor:
def __enter__(self):
print("Entrando...")
return self
def __exit__(self, tipo, valor, traza):
if tipo:
print("Ocurrió un error:", valor)
print("Saliendo...")
return True # suprime la excepción
with Gestor():
raise ValueError("Error de prueba")
6. Context managers anidados
from contextlib import ExitStack
with ExitStack() as stack:
f1 = stack.enter_context(open("a.txt"))
f2 = stack.enter_context(open("b.txt"))
f1.write("Hola")
f2.write("Mundo")
7. Ejercicios
- Crea un context manager que mida memoria usada.
- Crea un context manager que abra dos archivos a la vez.
- Crea un context manager que registre errores en un log.
- Implementa un context manager que bloquee un recurso.
- Usa ExitStack para manejar 3 archivos dinámicamente.
# medir memoria
import tracemalloc
class Mem:
def __enter__(self):
tracemalloc.start()
def __exit__(self, *a):
print(tracemalloc.get_traced_memory())
# log de errores
class Log:
def __exit__(self, tipo, valor, traza):
if tipo:
open("log.txt","a").write(str(valor))
8. Mini‑proyecto: Gestor de conexión simulada
class Conexion:
def __enter__(self):
print("Conectando...")
self.conectado = True
return self
def __exit__(self, tipo, valor, traza):
print("Cerrando conexión...")
self.conectado = False
with Conexion() as c:
print("Estado:", c.conectado)