4.3 Context Manager

En Python existe una construcción muy útil llamada context manager, que se utiliza a través de la palabra clave with.
El objetivo de un context manager es gestionar recursos de forma automática y segura, garantizando que se liberen correctamente incluso si ocurre un error durante su uso.

Este mecanismo se basa en entrar en un “contexto” con __enter__() y salir de él con __exit__(), lo cual permite automatizar tareas como:

  • cerrar archivos
  • liberar conexiones
  • realizar commit o rollback en bases de datos
  • liberar bloqueos de hilos
  • limpiar recursos temporales

Sin un context manager, el programador debe encargarse de abrir y cerrar recursos manualmente.
Por ejemplo, al trabajar con archivos:

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

Si ocurre un error entre open() y close(), el archivo podría quedar abierto, generando fugas de recursos o comportamientos inesperados.

El uso de with garantiza que el recurso se cierre automáticamente cuando termina el bloque, incluso si ocurre una excepción.

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

Aquí:

  • se abre el archivo
  • se ejecuta el bloque indentado
  • al salir del bloque, Python llama automáticamente a f.close()

Esto hace que el código sea más seguro, limpio y fácil de leer.

with open("datos.txt", "w") as f:
    f.write("Ejemplo de context manager")

En este caso, open() devuelve un objeto archivo que actúa como context manager.
Al finalizar el bloque, Python ejecuta automáticamente el cierre del archivo.

4.3.1 Ejemplo: conexión SQLite

Las conexiones SQLite también son context managers.
El siguiente código garantiza un commit() si todo va bien, o un rollback() si hay errores:

import sqlite3

with sqlite3.connect("personas.sqlite") as conn:
    cursor = conn.cursor()
    cursor.execute("INSERT INTO usuarios(nombre) VALUES ('Ana')")