-
Notifications
You must be signed in to change notification settings - Fork 0
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.
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.
with open("datos.txt", "r") as f:
contenido = f.read()
print(contenido)✔ El archivo se cierra automáticamente.
with open("salida.txt", "w") as f:
f.write("Hola Python")✔ No necesitas llamar a close().
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.
with open("a.txt") as f1, open("b.txt") as f2:
print(f1.read())
print(f2.read())✔ Todos los recursos se gestionan correctamente.
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 contextoclass 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.
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
Finfrom threading import Lock
lock = Lock()
with lock:
print("Sección crítica")✔ El lock se libera automáticamente.
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
¿Hay un recurso que debe cerrarse o liberarse?
→ Usa with
- 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
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.
Wiki educativa con ejemplos prácticos de Python en español, enfocada en aprendizaje claro y aplicable.
Todos los ejemplos muestran código y salida real.
📘 Índice principal: Home
🔁 Contenido actualizado regularmente
🌐 Relacionado: SolveConPython (versión en español en desarrollo)