IOKELU
Nivel: Avanzado – Guía 5
💡 Prueba el código:
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:

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

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)

Siguiente guía

Programación asíncrona (async/await) →