Saltar a contenido

Python decoradores

Un decorador estaremos trabajando, con por lo menos, 3 funciones. El input, el output y la función principal. Para que nos quede más en claro a mi me gusta nombrar a las funciones como: a, b y c.

Donde a recibe como parámetro b para dar como salida a c. Esta es una pequeña "formula" la cual me gusta mucho mencionar. 💻

a(b) -> c

Veamos un ejemplo de como crear un decorador en Python.

def funcion_a(funcion_b):
    def funcion_c():
        print('Antes de la ejecución de la función a decorar')
        funcion_b()
        print('Después de la ejecución de la función a decorar')

    return funcion_c

Ahora, ¿Qué pasa si nuestra función a decorar debe recibir argumentos y a su vez debe retornar algún valor? en estos casos haremos uso de los parámetros args y kwargs.

def funcion_a(funcion_b):
    def funcion_c(*args, **kwargs):
        print('Antes de la ejecución de la función a decorar')
        result = funcion_b(*args, **kwargs)
        print('Después de la ejecución de la función a decorar')    

        return result

    return funcion_c

@funcion_a
def suma(a, b):
    return a + b
Algo que me gustaría mencionar, es que por convención, no es una regla, la función anidada del decorador tendrá por nombre: wrapper, de igual forma, el nombre del decorador debe ser muy descriptivo. En términos simples, el decorador pudiera quedar de la siguiente manera.

def my_custome_decorator(function):
    def wrapper(*args, **kwargs):
        return function(*args, **kwargs)

    return wrapper

¿Es posible pasar argumentos extras a los decoradores? 🧐La respuesta es sí. 😉

``` python def my_decorator_name(name): def my_custome_decorator(function): def wrapper(*args, **kwargs):

        print('Name:', name)
        return function(*args, **kwargs)

    return wrapper

return my_custome_decorator

@my_decorator_name('CodigoFácilito') def suma(a, b): return a + b ```