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")
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