0Pricing
Python Academy · Lección

La sentencia with en profundidad

Comprenda cómo funciona with y por qué evita las fugas de recursos.

La sentencia with en profundidad es una lección gratuita de Python Academy en CoddyKit. Esta es la lección 1 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

La instrucción with garantiza que se ejecuten el código de preparación y el de limpieza, incluso cuando se producen excepciones.

Uso básico de with

with expr as var: — expr debe devolver un gestor de contexto. var queda vinculado a lo que devuelva __enter__.
with open('/tmp/cm_test.txt','w') as f:
    f.write('hello')
print('file closed:', f.closed)

Por qué existe with

Los recursos, como archivos, bloqueos y conexiones a bases de datos, deben liberarse. with garantiza la limpieza incluso si una excepción interrumpe el cuerpo.
# Without with:
# f = open('f.txt')
# try: ...
# finally: f.close()
# With with:
# with open('f.txt') as f: ...
print('with is cleaner')

Varios gestores de contexto

with open(a) as f, open(b) as g: abre dos recursos en una sola instrucción. Ambos se cierran al salir.
import tempfile, os
a = tempfile.mktemp(); b = tempfile.mktemp()
with open(a,'w') as fa, open(b,'w') as fb:
    fa.write('A'); fb.write('B')
os.unlink(a); os.unlink(b)
print('both closed')

with no suprime excepciones

De forma predeterminada, las excepciones del cuerpo de with se propagan. __exit__ puede suprimirlas si devuelve True.
try:
    with open('/nonexistent.txt') as f:
        pass
except FileNotFoundError as e:
    print('caught:', e)

Lock como gestor de contexto

threading.Lock() funciona como gestor de contexto: with lock: garantiza que el bloqueo siempre se libere.
import threading
lock = threading.Lock()
with lock:
    print('locked section')
print('lock released')

Patrón de conexión a una base de datos

Una conexión a una base de datos como gestor de contexto confirma los cambios si todo sale bien y revierte la transacción si se produce una excepción; es un patrón fundamental.
# Typical DB pattern:
# with db.transaction() as conn:
#     conn.execute(sql)
# commits on success, rolls back on exception
print('db pattern demo')

Instrucciones with anidadas

Las instrucciones with anidadas son válidas. El gestor de contexto interno sale primero y después lo hace el externo.
import tempfile
tmp = tempfile.mktemp()
with open(tmp,'w') as outer:
    with open(tmp,'r+') as inner:
        outer.write('x')
import os; os.unlink(tmp)
print('nested exit order')

contextlib.suppress

contextlib.suppress(ExcType) ignora silenciosamente un tipo de excepción específico dentro del bloque with.
from contextlib import suppress
with suppress(FileNotFoundError):
    open('/does/not/exist.txt')
print('no error raised')

contextlib.redirect_stdout

contextlib.redirect_stdout(f) redirige temporalmente la salida de print() a f.
from contextlib import redirect_stdout
import io
buf = io.StringIO()
with redirect_stdout(buf):
    print('captured')
print('got:', buf.getvalue())

ExitStack

contextlib.ExitStack gestiona un número dinámico de gestores de contexto; es útil cuando no sabe cuántos archivos debe abrir.
from contextlib import ExitStack
import tempfile, os
with ExitStack() as stack:
    files = [stack.enter_context(open(tempfile.mktemp(),'w')) for _ in range(3)]
    for f in files: f.write('x')
print('all closed')

Comprobación rápida

¿Qué hace contextlib.suppress(FileNotFoundError)?

Resumen

with garantiza la limpieza. Puede utilizar varios destinos en un mismo with. contextlib.suppress silencia errores específicos. ExitStack gestiona cantidades dinámicas de gestores de contexto.

Siga avanzando

¡Buen trabajo! La siguiente lección le espera.

Preguntas frecuentes

¿La lección «La sentencia with en profundidad» es gratis?

Sí — el texto completo de «La sentencia with en profundidad» 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 «La sentencia with en profundidad»?

Comprenda cómo funciona with y por qué evita las fugas de recursos. 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 1 de 4.

¿Cuánto tiempo toma la lección «La sentencia with en profundidad»?

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