Python Contextlib

Fariba Laiq 30 enero 2023
  1. Use la instrucción with como administrador de contexto en Python
  2. Use el decorador de funciones @contextmanager en Python
Python Contextlib

A veces, usamos algunos recursos como un archivo. Lo abrimos y nos olvidamos de cerrarlo cuando terminamos de trabajar con él.

Es una mala práctica de codificación y crea problemas cuando hay demasiados archivos abiertos. Incluso si ya no necesitamos esos recursos, el programa puede adquirirlos indefinidamente.

Esta situación provoca pérdidas de memoria. Para manejar estas cosas automáticamente, Python tiene administradores de contexto.

Se encargan de administrar los recursos. El contextlib es una biblioteca de Python que proporciona utilidades para la gestión de recursos utilizando la palabra clave with.

Use la instrucción with como administrador de contexto en Python

En Python, la instrucción with administra los recursos y maneja las excepciones. Así que funciona como un administrador de contexto.

Cuando el código llega a una declaración con, asigna recursos temporalmente. Los recursos adquiridos previamente se liberan cuando el bloque de instrucciones with finaliza su ejecución.

En el siguiente código, hemos creado y abierto un archivo. Los recursos adquiridos en el bloque with se liberarán cuando el control esté fuera del bloque with.

Código de ejemplo:

with open("file.txt", "w+") as f:
    print("File Opened")

Producción :

File Opened

También podemos incluir la funcionalidad del administrador de contexto en nuestros programas. Para ello, nuestra clase debe tener los métodos __enter__() y __exit__().

Para comprender el flujo del administrador de contexto, hemos ejecutado el siguiente código con la instrucción print que se ejecuta cuando el control se transfiere al bloque respectivo.

Código de ejemplo:

class MyContextManager:
    def __init__(self):
        print("In init method")

    def __enter__(self):
        print("In enter method")

    def __exit__(self, exc_type, exc_value, exc_traceback):
        print("In exit method")


with MyContextManager() as m:
    print("With block")

Producción :

In init method
In enter method
With block
In exit method

Use el decorador de funciones @contextmanager en Python

Otro método para hacer una función como administrador de contexto es usar el decorador de funciones @contextmanager. Un decorador es una función que toma otra función como entrada, amplía su funcionalidad/modifica su comportamiento y devuelve otra función como salida.

No tenemos que escribir la clase separada o las funciones __enter__() y __exit__() cuando usamos este decorador. Tenemos que importar el administrador de contexto desde el módulo contextlib.

Usaremos el @contextmanager encima de nuestra función. La palabra clave yield es como la instrucción return utilizada para devolver valores/control.

Todo lo anterior a la palabra clave yield se considerará la sección __enter__, y todo lo posterior a yield se considerará la sección __exit__.

Código de ejemplo:

from contextlib import contextmanager


@contextmanager
def MyContextManager():
    print("In enter method")
    yield
    print("In exit method")


with MyContextManager() as m:
    print("With block")

Producción :

In enter method
With block
In exit method
Fariba Laiq avatar Fariba Laiq avatar

I am Fariba Laiq from Pakistan. An android app developer, technical content writer, and coding instructor. Writing has always been one of my passions. I love to learn, implement and convey my knowledge to others.

LinkedIn