Skip to content

Context managers en Python — `with` y recursos

Ben Kemp | Python/SQL/PowerBI/Excel Tutorials edited this page Jan 15, 2026 · 1 revision

Context managers en Python — with y recursos

Los context managers permiten manejar recursos (archivos, conexiones, locks, etc.) de forma segura y limpia, asegurando que se liberen correctamente incluso si ocurre un error.

En Python, se usan principalmente mediante la instrucción with.


Por qué usar context managers

Sin with, es fácil olvidar cerrar recursos:

f = open("datos.txt")
contenido = f.read()
f.close()

Si ocurre un error entre open() y close(), el recurso puede quedar abierto.

Los context managers solucionan este problema automáticamente.

Sintaxis básica de with with expresion as variable: # uso del recurso

Al salir del bloque with, Python libera el recurso siempre.

Ejemplo 1: Leer un archivo con with

with open("datos.txt", "r") as f:
    contenido = f.read()
    print(contenido)

✔ El archivo se cierra automáticamente.

Ejemplo 2: Escribir en un archivo con with

with open("salida.txt", "w") as f:
    f.write("Hola Python")

✔ No necesitas llamar a close().

Ejemplo 3: with + excepciones

try:
    with open("datos.txt") as f:
        contenido = f.read()
except FileNotFoundError:
    print("Archivo no encontrado")

✔ El archivo se cierra incluso si ocurre una excepción.

Ejemplo 4: Múltiples context managers

with open("a.txt") as f1, open("b.txt") as f2:
    print(f1.read())
    print(f2.read())

✔ Todos los recursos se gestionan correctamente.

Ejemplo 5: Context manager personalizado (clase)

Para crear un context manager propio, implementa:

__enter__

__exit__

class MiContexto:
    def __enter__(self):
        print("Entrando al contexto")
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        print("Saliendo del contexto")

with MiContexto():
    print("Dentro del bloque")

Salida:

Entrando al contexto
Dentro del bloque
Saliendo del contexto

Ejemplo 6: Capturar excepciones en exit

class MiContexto:
    def __enter__(self):
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        print("Limpiando recursos")
        return True

⚠ Retornar True evita que la excepción se propague.

Ejemplo 7: Context manager con contextlib

Python ofrece una forma más simple con contextlib.

from contextlib import contextmanager

@contextmanager
def mi_contexto():
    print("Inicio")
    yield
    print("Fin")

with mi_contexto():
    print("Dentro")
```python

Salida:

```python
Inicio
Dentro
Fin

Ejemplo 8: Uso real — lock de threading

from threading import Lock

lock = Lock()

with lock:
    print("Sección crítica")

✔ El lock se libera automáticamente.

Ejemplo 9: Uso real — temporizadores

from time import time

class Timer:
    def __enter__(self):
        self.inicio = time()
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        print("Tiempo:", time() - self.inicio)

with Timer():
    sum(range(1000000))

Salida (aprox):

Tiempo: 0.05

Ejemplo 10: Regla práctica rápida

¿Hay un recurso que debe cerrarse o liberarse? → Usa with

Buenas prácticas

  • Usa with siempre que sea posible
  • No llames manualmente a close() dentro del bloque
  • Usa contextlib para contextos simples
  • No ocultes excepciones sin motivo (return True)
  • Prefiere with sobre try/finally manual

Conclusión

Los context managers hacen que el código Python sea:

  • Más seguro
  • Más limpio
  • Más fácil de mantener

Si trabajas con archivos, conexiones o recursos compartidos, with no es opcional, es una buena práctica esencial.

Clone this wiki locally