0Pricing
Python Academy · Lección

contextlib: @contextmanager

Cree gestores de contexto de forma concisa con el decorador de contextlib.

contextlib: @contextmanager es una lección gratuita de Python Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Python Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Python Academy incluye 4 lecciones en total.

¿Por qué contextlib?

contextlib.contextmanager le permite escribir un gestor de contexto como una función generadora en lugar de una clase, lo que reduce el código repetitivo.

from contextlib import contextmanager

@contextmanager
def managed():
    print("setup")
    yield
    print("teardown")

with managed():
    print("inside")

Ceder un valor

Todo lo que ceda con yield se vincula a la variable indicada después de as en la instrucción with.

from contextlib import contextmanager

@contextmanager
def temp_list():
    lst = []
    yield lst
    print(f"Final list: {lst}")

with temp_list() as lst:
    lst.append(1)
    lst.append(2)

Manejo de excepciones en @contextmanager

Incluya yield en un bloque try/finally para garantizar la limpieza incluso si se produce una excepción.

from contextlib import contextmanager

@contextmanager
def safe_open(path):
    f = open(path)
    try:
        yield f
    finally:
        f.close()

with safe_open("data.txt") as f:
    print(f.read())

Supresión de excepciones

Capture la excepción dentro del generador para suprimirla, igual que al devolver True desde __exit__.

from contextlib import contextmanager

@contextmanager
def ignore_value_errors():
    try:
        yield
    except ValueError:
        pass

with ignore_value_errors():
    raise ValueError("ignored")

contextlib.suppress

contextlib.suppress(*exceptions) es un gestor de contexto ya preparado que suprime los tipos de excepción especificados.

from contextlib import suppress

with suppress(FileNotFoundError):
    open("missing.txt")

print("continues")

contextlib.closing

closing(obj) crea un gestor de contexto que llama a obj.close() al salir. Es útil para objetos que tienen close() pero no __exit__.

from contextlib import closing
from urllib.request import urlopen

with closing(urlopen("https://example.com")) as page:
    content = page.read()

contextlib.nullcontext

nullcontext es un gestor de contexto que no realiza ninguna operación. Es útil cuando un gestor de contexto es opcional.

from contextlib import nullcontext

def process(data, lock=None):
    cm = lock if lock is not None else nullcontext()
    with cm:
        return [x*2 for x in data]

contextlib.ExitStack

ExitStack le permite gestionar dinámicamente un número variable de gestores de contexto.

from contextlib import ExitStack

files = ["a.txt", "b.txt", "c.txt"]
with ExitStack() as stack:
    handles = [stack.enter_context(open(f)) for f in files]
    data = [h.read() for h in handles]

Reutilizar un @contextmanager

Un gestor de contexto basado en un generador solo puede usarse una vez por llamada. Vuelva a llamar a la función decorada para reutilizarlo.

from contextlib import contextmanager

@contextmanager
def counter():
    count = 0
    yield lambda: count.__add__  # each call is independent
    print("done")

with counter():
    pass
with counter():
    pass

asynccontextmanager

Para código asíncrono, use contextlib.asynccontextmanager para escribir gestores de async with como generadores.

from contextlib import asynccontextmanager

@asynccontextmanager
async def async_session():
    session = await create_session()
    try:
        yield session
    finally:
        await session.close()

contextlib.redirect_stdout

Redirija temporalmente la salida estándar a cualquier objeto similar a un archivo.

import io
from contextlib import redirect_stdout

buf = io.StringIO()
with redirect_stdout(buf):
    print("captured")

print(buf.getvalue())  # captured

Comprobación rápida

En un generador @contextmanager, ¿dónde debe colocarse el código de limpieza para garantizar que se ejecute incluso si se produce una excepción?

Resumen

@contextmanager convierte un generador en un gestor de contexto. Use try/finally alrededor de yield para realizar una limpieza segura. El módulo contextlib también proporciona suppress, nullcontext, ExitStack y mucho más.

Preguntas frecuentes

¿La lección «contextlib: @contextmanager» es gratis?

Sí — el texto completo de «contextlib: @contextmanager» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Python Academy, actualiza a CoddyKit PRO. El curso de Python Academy incluye 4 lecciones en total.

¿Qué aprenderé en «contextlib: @contextmanager»?

Cree gestores de contexto de forma concisa con el decorador de contextlib. Practicas Python Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Python Academy?

No se requiere experiencia previa. Python Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.

¿Cuánto tiempo toma la lección «contextlib: @contextmanager»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Python Academy?

Sí. Cada lección de Python Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. La sentencia with en profundidad
  2. Protocolo __enter__ y __exit__
  3. contextlib: @contextmanager
  4. Patrones prácticos de gestores de contexto
← Volver a Python Academy