Cómo utilizar administradores de contexto en Python (con declaración)

Aprenda cómo funcionan los administradores de contexto en Python. Domine la declaración with, administre los recursos del sistema y escriba administradores de contexto personalizados.

Pruebe esta solución en el Editor

Descripción general

Administrar adecuadamente los recursos externos (como cerrar identificadores de archivos, desconectar conexiones de bases de datos y liberar bloqueos de subprocesos) es esencial para crear software confiable y listo para producción. No liberar recursos puede provocar pérdidas de memoria, errores de bloqueo de archivos y bloqueos de aplicaciones.

La declaración "with" de Python simplifica la limpieza de recursos mediante la creación de un administrador de contexto. Un administrador de contexto garantiza que las acciones de limpieza se ejecuten automáticamente cuando el control abandona el bloque, incluso si el código genera una excepción o sale antes de tiempo. Esto elimina la necesidad de bloques detallados y repetitivos de "intentar finalmente".

Si bien los administradores de contexto se asocian más comúnmente con operaciones integradas como `open()`, puedes diseñar fácilmente tus propios administradores de contexto personalizados. Puedes construirlos creando una clase que implemente los métodos mágicos `__enter__` y `__exit__`, o escribiendo una función generadora decorada con el decorador `contextlib.contextmanager`.

Código y salida de ejecución

Este script demuestra cómo escribir administradores de contexto personalizados en Python utilizando implementaciones de clases y decoradores de biblioteca de contexto.

context_managers.py
Pruébelo en el editor
from contextlib import contextmanager

# Method 1: Class-based context manager
class CustomResource:
    def __enter__(self):
        print("[Resource] Opening connection...")
        return self

    def do_work(self):
        print("[Resource] Performing action...")

    def __exit__(self, exc_type, exc_val, exc_tb):
        print("[Resource] Closing connection safely.")
        return False

print("--- Class Context Manager ---")
with CustomResource() as resource:
    resource.do_work()

# Method 2: Generator-based context manager (contextlib)
@contextmanager
def simple_timer():
    print("\n[Timer] Started...")
    try:
        yield
    finally:
        print("[Timer] Finished!")

print("\n--- Decorator Context Manager ---")
with simple_timer():
    print("Performing tasks inside context...")
Salida terminal
--- Class Context Manager ---
[Resource] Opening connection...
[Resource] Performing action...
[Resource] Closing connection safely.

--- Decorator Context Manager ---

[Timer] Started...
Performing tasks inside context...
[Timer] Finished!

Implementación paso a paso

  • Utilice la instrucción with al abrir archivos, bases de datos o bloqueos para garantizar la seguridad de los recursos.
  • Defina administradores de contexto personalizados utilizando clases con métodos mágicos __enter__ y __exit__.
  • Utilice el decorador @contextlib.contextmanager en una función generadora como una alternativa más simple basada en funciones.
  • Coloque acciones de cierre de recursos dentro del bloque de limpieza para garantizar que se ejecuten incluso si se producen errores.

Preguntas frecuentes

¿Qué parámetros recibe el método __exit__?

El método __exit__ recibe tres argumentos que representan los detalles de la excepción, si se generó alguno: exc_type (tipo de excepción), exc_val (valor de excepción) y exc_tb (rastreo). Si no se produjo ningún error, los tres se pasan como Ninguno.

¿Puede un administrador de contexto suprimir excepciones?

Sí. Si el método __exit__ devuelve un valor verdadero (como True), Python suprime la excepción y la ejecución continúa después del bloque with. Si devuelve False, la excepción se genera normalmente.

Temas relacionados

Recursos recomendados de Python

Amplíe sus conocimientos con tutoriales interactivos relacionados, hojas de trucos y comparaciones de códigos.