Python Language Funzione Decoratore


Esempio

I decoratori aumentano il comportamento di altre funzioni o metodi. Qualsiasi funzione che prende una funzione come parametro e restituisce una funzione aumentata può essere utilizzata come decoratore .

# This simplest decorator does nothing to the function being decorated. Such
# minimal decorators can occasionally be used as a kind of code markers.
def super_secret_function(f):
    return f

@super_secret_function
def my_function():
    print("This is my secret function.")

La @ -notation è zucchero sintattico che è equivalente al seguente:

my_function = super_secret_function(my_function)

È importante tenerlo presente per capire come funzionano i decoratori. Questa sintassi "unsugared" rende chiaro il motivo per cui la funzione decoratore prende una funzione come argomento e perché dovrebbe restituire un'altra funzione. Dimostra anche cosa succederebbe se non si restituisse una funzione:

def disabled(f):
    """
    This function returns nothing, and hence removes the decorated function
    from the local scope.
    """
    pass

@disabled
def my_function():
    print("This function can no longer be called...")

my_function()
# TypeError: 'NoneType' object is not callable

Pertanto, di solito definiamo una nuova funzione all'interno del decoratore e la restituiamo. Questa nuova funzione dovrebbe prima fare qualcosa che deve fare, quindi chiamare la funzione originale e infine elaborare il valore di ritorno. Considera questa semplice funzione di decoratore che stampa gli argomenti ricevuti dalla funzione originale, quindi li chiama.

#This is the decorator
def print_args(func):
    def inner_func(*args, **kwargs):
        print(args)
        print(kwargs)
        return func(*args, **kwargs) #Call the original function with its arguments.
    return inner_func

@print_args
def multiply(num_a, num_b):
    return num_a * num_b
  
print(multiply(3, 5))
#Output:
# (3,5) - This is actually the 'args' that the function receives.
# {} - This is the 'kwargs', empty because we didn't specify keyword arguments.
# 15 - The result of the function.