Contenedores de funciones en Python

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

Deja una respuesta

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