Administrador de contexto usando el decorador @contextmanager

Los decoradores son una herramienta muy poderosa y útil en Python, ya que permite a los programadores modificar el comportamiento de una función o clase. Los decoradores nos permiten envolver otra función para extender el comportamiento de la función envuelta, sin modificarla permanentemente.
 

Sintaxis: 

@decorator
def function(args):
    statements(s)

Ejemplo:  

Python3

# Python program to demonstrate
# decorators
 
def msg_decorator(func):
     
    # Inner function
    def msg_wrapper(msg):
        print("A decorated line:", func(msg))
         
    return msg_wrapper
 
# Using the decorator
@msg_decorator
def print_name(name):
    return name
 
print_name("Pooventhiran")
Producción: 

A decorated line: Pooventhiran

 

En este ejemplo, cada vez que se llama a print_name(), primero se llama a msg_decorator con print_name como argumento. Dentro de msg_decorator, se devuelve msg_wrapper que simplemente llama a cualquier función pasada a msg_decorator con los argumentos pasados. Aunque este ejemplo es simple, estos son muy poderosos en casos de uso reales, como la verificación de condiciones especiales/límites, preprocesamiento, etc.
Nota: para obtener más información, consulte Decoradores en Python .
 

Administrador de contexto

Los administradores de contexto son los administradores de recursos de Python. En la mayoría de los casos, usamos archivos como recursos (un recurso simple). A menudo no nos preocupamos por cerrar los archivos al final de la ejecución. Esta es una mala práctica de codificación y también causa problemas cuando se abren demasiados archivos o cuando el programa finaliza con una falla porque el recurso no se libera correctamente. Los administradores de contexto son el rescate para este problema al administrar automáticamente los recursos. En Python, se usa la palabra clave with.
 

Ejemplo:

Python3

# Python program to demonstrate
# Context Manager
 
with open('testfile.txt') as in_file:
    print(''.join(in_file.readlines()))

En el ejemplo que se muestra arriba, el propio ContextManager administra el archivo utilizado, ya que cierra el archivo incluso si el programa falla. Esta función de administrador de contexto también se puede integrar en nuestros programas. El usuario debe asegurarse de que la clase tenga los métodos: __enter__() y __exit__(). Veamos una plantilla con estos métodos especiales.
 

Python3

# Python program creating a
# context manager
   
class ContextManager():
    def __init__(self):
        print('init method called')
           
    def __enter__(self):
        print('enter method called')
        return self
       
    def __exit__(self, exc_type, exc_value, exc_traceback):
        print('exit method called')
   
# Driver code
with ContextManager() as manager:
    print('with statement block')
        

Producción:
 

init method called
enter method called
with statement block
exit method called

En el código anterior, __enter__ se ejecutará cuando el control ingrese con y __exit__, cuando el control salga con la cláusula. Simplemente podemos hacer cualquier función como administrador de contexto con la ayuda del decorador contextlib.contextmanager sin tener que escribir una clase separada o funciones __enter__ y __exit__.
 

Usando @contextmanager

Tenemos que usar contextlib.contextmanager para decorar una función generadora que produce exactamente una vez . Todo lo anterior al rendimiento se considera una sección de __entrada__ y todo lo posterior, una sección de __salida__. La función generadora debería producir el recurso. 
 

Ejemplo: reescribamos el ejemplo anterior con este decorador 

Python3

# Python program for creating a
# context manager using @contextmanager
# decorator
 
from contextlib import contextmanager
 
@contextmanager
def ContextManager():
     
    # Before yield as the enter method
    print("Enter method called")
    yield
     
    # After yield as the exit method
    print("Exit method called")
 
with ContextManager() as manager:
    print('with statement block')

Producción:

Enter method called
with statement block
Exit method called 

Publicación traducida automáticamente

Artículo escrito por PooventhiranG y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *