Python Contextlib
-
Use la instrucción
with
como administrador de contexto en Python -
Use el decorador de funciones
@contextmanager
en Python
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
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