Administradores de contexto de Python: creación personalizada con bloques

Aprenda a escribir administradores de contexto personalizados en Python. Domine el decorador de contextmanager y los métodos __enter__/__exit__ para la seguridad de los recursos.

Pruébelo en el editor

Descripción general

Los administradores de contexto son un mecanismo elegante en Python diseñado para manejar la configuración y desmontaje de recursos externos. En software, muchas operaciones requieren pares de acciones: abrir y cerrar archivos, conectarse y desconectarse de bases de datos, o adquirir y liberar bloqueos. Si un programa falla después del paso de configuración pero antes del paso de desmontaje, esos recursos permanecen bloqueados en la memoria. Los administradores de contexto garantizan que los recursos se limpien de forma segura en todas las circunstancias.

La forma estándar de invocar un administrador de contexto es utilizar la declaración "with". En esencia, cualquier objeto utilizado en una declaración "with" debe implementar el protocolo de administrador de contexto. Este protocolo consta de dos métodos especiales: `__enter__()` y `__exit__()`. Cuando comienza el bloque `with`, se llama a `__enter__()` para preparar el recurso. Cuando el bloque `with` finaliza o genera una excepción, `__exit__()` se activa automáticamente y recibe información sobre cualquier excepción generada para que pueda manejar la limpieza o suprimir errores.

Para casos de uso simples, escribir una clase con los métodos `__enter__` y `__exit__` puede parecer detallado. Para simplificar esto, la biblioteca estándar de Python proporciona el módulo `contextlib`, que presenta el decorador `@contextmanager`. Este decorador le permite escribir una función generadora simple que contenga una única declaración de "rendimiento". El código antes de "rendimiento" actúa como configuración, el valor obtenido actúa como recurso y el código después de "rendimiento" representa la limpieza. Dominar los administradores de contexto garantiza que sus aplicaciones permanezcan libres de fugas.

Código y salida de ejecución

Una clase personalizada que implementa __enter__ y __exit__ para gestionar los límites del registro de ejecución.

context_managers.py
Pruébelo en el editor
class CustomManager:
    def __enter__(self):
        print("--> Resource Setup: Entering the block")
        return "RESOURCE_KEY"

    def __exit__(self, exc_type, exc_value, traceback):
        print("<-- Resource Teardown: Exiting the block")
        if exc_type:
            print(f"Exception Intercepted: {exc_value}")
        return True  # Suppress exceptions

with CustomManager() as res:
    print(f"Working inside block with resource: {res}")
    # Force an error to verify exception handling
    x = 1 / 0
print("Program continues running safely.")
Salida terminal
--> Resource Setup: Entering the block
Working inside block with resource: RESOURCE_KEY
<-- Resource Teardown: Exiting the block
Exception Intercepted: division by zero
Program continues running safely.

Implementación paso a paso

  • Administrar transacciones de bases de datos (comprometerse en caso de éxito, revertir en caso de error)
  • Adquirir y liberar bloqueos de subprocesos en código multiproceso
  • Redirigir la salida estándar (stdout) durante los scripts de prueba unitaria

Preguntas frecuentes

¿Cómo suprimo excepciones en un administrador de contexto personalizado?

Devolviendo True desde el método __exit__. Si devuelve True, se suprimirá cualquier excepción generada dentro del bloque.

¿Puedes combinar varios administradores de contexto en una sola declaración?

Sí, puede separarlos con comas, por ejemplo, con open('file1.txt') como f1, open('file2.txt') como f2:.

Temas relacionados

Recursos recomendados de Python

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