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
2. Dentro de la función
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