Los envoltorios alrededor de las funciones también se conocen como decoradores , que son una herramienta muy poderosa y útil en Python, ya que permite a los programadores modificar el comportamiento de la función o clase. Los decoradores nos permiten envolver otra función para extender el comportamiento de la función envuelta, sin modificarla permanentemente. En Decorators, las funciones se toman como argumento en otra función y luego se llaman dentro de la función contenedora.
Sintaxis:
@wrapper def function(n): statements(s)
Esto también es similar a
def function(n): statement(s) function = wrapper(function)
Veamos los siguientes ejemplos para una mejor comprensión.
Ejemplo 1:
# defining a decorator def hello_decorator(func): # inner1 is a Wrapper function in # which the argument is called # inner function can access the outer local # functions like in this case "func" def inner1(): print("Hello, this is before function execution") # calling the actual function now # inside the wrapper function. func() print("This is after function execution") return inner1 # defining a function, to be called inside wrapper def function_to_be_used(): print("This is inside the function !!") # passing 'function_to_be_used' inside the # decorator to control its behavior function_to_be_used = hello_decorator(function_to_be_used) # calling the function function_to_be_used()
Producción:
Hello, this is before function execution This is inside the function !! This is after function execution
Ejemplo 2: Definamos un decorador que cuente el tiempo que tarda la función en ejecutarse.
import time def timeis(func): '''Decorator that reports the execution time.''' def wrap(*args, **kwargs): start = time.time() result = func(*args, **kwargs) end = time.time() print(func.__name__, end-start) return result return wrap @timeis def countdown(n): '''Counts down''' while n > 0: n -= 1 countdown(5) countdown(1000)
Producción:
countdown 1.6689300537109375e-06 countdown 5.507469177246094e-05
Es fundamental enfatizar que los decoradores generalmente no modifican la firma de llamada ni el valor devuelto de la función que se está ajustando. El uso de *args y **kwargs está ahí para asegurarse de que se pueda aceptar cualquier argumento de entrada. El valor de retorno de un decorador es casi siempre el resultado de llamar a func(*args, **kwargs) , donde func es la función original sin encapsular.
Consulte Decoradores en Python para obtener más detalles.
Publicación traducida automáticamente
Artículo escrito por yuvrajeyes y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA