Decoradores con parámetros en Python

Requisito previo: Decoradores en Python , Decoradores de funciones

Sabemos que 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. En este artículo, aprenderemos sobre los decoradores con parámetros con la ayuda de múltiples ejemplos. 
Las funciones de Python son ciudadanos de primera clase, lo que significa que las funciones pueden tratarse de manera similar a los objetos. 
 

  • Se puede asignar una función a una variable, es decir, se puede hacer referencia a ellas.
  • La función se puede pasar como argumento a otra función.
  • La función se puede devolver desde una función.

Los decoradores con parámetros son similares a los decoradores normales.
 

La sintaxis para decoradores con parámetros:

@decorator(params)
def func_name():
    ''' Function implementation'''

El código anterior es equivalente a 

def func_name():
    ''' Function implementation'''

func_name = (decorator(params))(func_name)
"""

A medida que la ejecución comienza de izquierda a derecha , se llama a decorator(params) , que devuelve un objeto de función fun_obj . Usando fun_obj se realiza la llamada fun_obj(fun_name) . Dentro de la función interna, se realizan las operaciones requeridas y se devuelve la referencia de función real que se asignará a func_name . Ahora, func_name() se puede usar para llamar a la función con el decorador aplicado.
 

Cómo se implementa Decorator con parámetros 

Python3

def decorators(*args, **kwargs):
    def inner(func):
        '''
           do operations with func
        '''
        return func
    return inner #this is the fun_obj mentioned in the above content
 
@decorators(params)
def func():
    """
         function implementation
    """

Aquí los parámetros también pueden estar vacíos.
 

Observa estos primero:

Python3

# Python code to illustrate
# Decorators basic in Python
 
def decorator_fun(func):
  print("Inside decorator")
 
  def inner(*args, **kwargs):
    print("Inside inner function")
    print("Decorated the function")
    # do operations with func
     
    func()
     
  return inner
 
@decorator_fun
def func_to():
    print("Inside actual function")
 
func_to()

De otra manera:
 

Python3

# Python code to illustrate
# Decorators with parameters in Python
 
def decorator_fun(func):
  print("Inside decorator")
 
  def inner(*args, **kwargs):
    print("Inside inner function")
    print("Decorated the function")
     
    func()
     
  return inner
 
 
def func_to():
    print("Inside actual function")
 
# another way of using decorators
decorator_fun(func_to)()

Producción: 

Inside decorator
Inside inner function
Decorated the function
Inside actual function

  
Pasemos a otro ejemplo:
 

Ejemplo 1: 

Python3

# Python code to illustrate
# Decorators with parameters in Python
 
def decorator(*args, **kwargs):
    print("Inside decorator")
     
    def inner(func):
         
        # code functionality here
        print("Inside inner function")
        print("I like", kwargs['like'])
         
        func()
         
    # returning inner function   
    return inner
 
@decorator(like = "geeksforgeeks")
def my_func():
    print("Inside actual function")

Producción: 
 

Inside decorator
Inside inner function
I like geeksforgeeks
Inside actual function

Ejemplo #2: 
 

Python3

# Python code to illustrate
# Decorators with parameters in Python
 
def decorator_func(x, y):
 
    def Inner(func):
 
        def wrapper(*args, **kwargs):
            print("I like Geeksforgeeks")
            print("Summation of values - {}".format(x+y) )
 
            func(*args, **kwargs)
             
        return wrapper
    return Inner
 
 
# Not using decorator
def my_fun(*args):
    for ele in args:
        print(ele)
 
# another way of using decorators
decorator_func(12, 15)(my_fun)('Geeks', 'for', 'Geeks')

Producción:  

I like Geeksforgeeks
Summation of values - 27
Geeks
for
Geeks

Este ejemplo también nos dice que la función interna adjunta puede acceder a los parámetros de la función externa. 
 

Ejemplo #3:  

Python3

# Python code to illustrate
# Decorators with parameters in Python  (Multi-level Decorators)
 
 
def decodecorator(dataType, message1, message2):
    def decorator(fun):
        print(message1)
        def wrapper(*args, **kwargs):
            print(message2)
            if all([type(arg) == dataType for arg in args]):
                return fun(*args, **kwargs)
            return "Invalid Input"
        return wrapper
    return decorator
 
 
@decodecorator(str, "Decorator for 'stringJoin'", "stringJoin started ...")
def stringJoin(*args):
    st = ''
    for i in args:
        st += i
    return st
 
 
@decodecorator(int, "Decorator for 'summation'\n", "summation started ...")
def summation(*args):
    summ = 0
    for arg in args:
        summ += arg
    return summ
 
 
print(stringJoin("I ", 'like ', "Geeks", 'for', "geeks"))
print()
print(summation(19, 2, 8, 533, 67, 981, 119))

Producción:  

Decorator for 'stringJoin'
Decorator for 'summation'

stringJoin started ...
I like Geeksforgeeks

summation started ...
1729

1. Dentro del decorador

inside-the-decorator-python

2. Dentro de la función

inside-function-decorator-python

Nota: Las instantáneas de imágenes se toman con PythonTutor.
 

Publicación traducida automáticamente

Artículo escrito por KundaRamaKrishna 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 *