0Pricing
Python Academy · Lección

Patrones prácticos de gestores de contexto

Aplique gestores de contexto a archivos, bloqueos, temporizadores y conexiones a bases de datos.

Patrones prácticos de gestores de contexto es una lección gratuita de Python Academy en CoddyKit. Esta es la lección 4 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.

Introducción

Los gestores de contexto resuelven de forma elegante problemas reales de gestión de recursos relacionados con archivos, bases de datos, bloqueos, temporizadores y mucho más.

Canalización de procesamiento de archivos

Abra juntos los archivos de entrada y salida, procese el contenido línea por línea y cierre ambos automáticamente.
import io
src = io.StringIO('line1\nline2\nline3')
dst = io.StringIO()
with src, dst:
    for line in src:
        dst.write(line.upper())
print(dst.getvalue())

Transacción de base de datos

Incluya las operaciones de la base de datos en un gestor de contexto: confirme los cambios si todo termina correctamente, reviértalos si se produce una excepción y cierre siempre la conexión.
from contextlib import contextmanager
@contextmanager
def db_transaction(conn):
    try:
        yield conn
        print('COMMIT')
    except Exception as e:
        print(f'ROLLBACK: {e}')
        raise
    finally:
        print('CLOSE')
with db_transaction({'execute': lambda q: print(f'SQL: {q}')}) as db:
    db['execute']('INSERT ...')

Bloqueo de subprocesos

with lock: adquiere el bloqueo, ejecuta el cuerpo y lo libera al salir; no necesita llamadas manuales a acquire/release.
import threading
lock = threading.Lock()
shared = []
def add(x):
    with lock:
        shared.append(x)
add(1); add(2)
print(shared)

Cambio de directorio

os.chdir() cambia globalmente el directorio de trabajo. Un gestor de contexto lo guarda y lo restaura.
from contextlib import contextmanager
import os
@contextmanager
def chdir(path):
    old = os.getcwd()
    os.chdir(path)
    try: yield
    finally: os.chdir(old)
original = os.getcwd()
with chdir('/tmp'):
    print('in tmp:', os.getcwd())
print('back:', os.getcwd())

Archivos temporales

tempfile.NamedTemporaryFile como gestor de contexto crea y elimina automáticamente un archivo temporal.
import tempfile
with tempfile.NamedTemporaryFile(mode='w', suffix='.txt', delete=True) as f:
    f.write('temp data')
    print('temp file:', f.name)
print('deleted')

Modificación de variables de entorno

Establezca temporalmente una variable de entorno para una prueba o un subproceso y, después, restáurela.
from contextlib import contextmanager
import os
@contextmanager
def env(**kwargs):
    old = {k: os.environ.get(k) for k in kwargs}
    os.environ.update({k:str(v) for k,v in kwargs.items()})
    try: yield
    finally:
        for k,v in old.items():
            if v is None: os.environ.pop(k,None)
            else: os.environ[k]=v
with env(DEBUG='1', LOG_LEVEL='DEBUG'):
    print(os.environ['DEBUG'])

Bloque de perfilado

Envuelva un bloque con cProfile para medir su rendimiento dentro de un gestor de contexto.
from contextlib import contextmanager
import cProfile
@contextmanager
def profile():
    pr = cProfile.Profile()
    pr.enable()
    yield pr
    pr.disable()
with profile() as pr:
    sum(range(1000000))
print('profiled')

Socket de red

Los sockets implementan el protocolo de gestor de contexto: with socket.socket() as s: cierra el socket al salir.
import socket
try:
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.settimeout(0.1)
        print('socket ready')
except Exception as e:
    print(f'socket: {e}')

Captura de advertencias

warnings.catch_warnings() captura las advertencias emitidas dentro del bloque, lo que resulta útil en las pruebas.
import warnings
with warnings.catch_warnings(record=True) as w:
    warnings.simplefilter('always')
    warnings.warn('test warning')
print(len(w), w[0].category.__name__)

Combinación de patrones

Los gestores de contexto reales suelen combinar varios patrones: transacciones, registro y medición de tiempos en un único componente reutilizable.
from contextlib import contextmanager
import time
@contextmanager
def timed_operation(name):
    print(f'[{name}] start')
    t0 = time.perf_counter()
    try:
        yield
        print(f'[{name}] done in {time.perf_counter()-t0:.4f}s')
    except Exception as e:
        print(f'[{name}] failed: {e}')
        raise
with timed_operation('loop'):
    sum(range(100000))

Comprobación rápida

¿Qué primitiva de threading implementa el protocolo de gestor de contexto para permitir un acceso concurrente seguro?

Resumen

Patrones de gestores de contexto: canalizaciones de archivos, transacciones de bases de datos, bloqueos, cambios de directorio, archivos temporales, modificaciones de variables de entorno y perfilado. Use ExitStack para pilas dinámicas de recursos.

Continúe

¡Excelente trabajo! Le espera la siguiente lección.

Preguntas frecuentes

¿La lección «Patrones prácticos de gestores de contexto» es gratis?

Sí — el texto completo de «Patrones prácticos de gestores de contexto» 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 «Patrones prácticos de gestores de contexto»?

Aplique gestores de contexto a archivos, bloqueos, temporizadores y conexiones a bases de datos. 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 4 de 4.

¿Cuánto tiempo toma la lección «Patrones prácticos de gestores de contexto»?

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