37 Функция декоратора

Декораторы улучшают поведение других функций или методов. Любая функцию , которая принимает функцию в качестве параметра и возвращает дополненную функцию можно использовать в качестве декоратора.

 # 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.")

 

@ -Notation является синтаксический сахар , который эквивалентен следующему:

 my_function = super_secret_function(my_function)

 

Важно иметь это в виду, чтобы понять, как работают декораторы. Этот «неосведомленный» синтаксис проясняет, почему функция декоратора принимает функцию в качестве аргумента и почему она должна возвращать другую функцию. Он также показывает , что произойдет , если вы не вернете функцию:

 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

 

Таким образом, мы обычно определяем новую функцию внутри декоратора и вернуть его. Эта новая функция сначала должна выполнить то, что ей нужно, затем вызвать исходную функцию и, наконец, обработать возвращаемое значение. Рассмотрим эту простую функцию декоратора, которая печатает аргументы, которые получает исходная функция, а затем вызывает ее.

 #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.