Сегодня приведем небольшой пример создания функции декоратора. Она будет принимать один или несколько аргументов и использовать их. Сам декоратор, способный принимать аргументы, будет выглядеть так:
@mydecorator(my_argument) def my_decorated_function(input): return input
В качестве самого простого примера можно привести вывод определенных данных до и после того, как функция была введена.
@mydecorator('-------------------') def my_decorated_function(input): return input print(my_decorated_function('Hello, World!')
В результате, вывод будет следующим.
——————-
Hello, World!
——————-
Декоратор Python без аргументов
А теперь, для примера, проанализируем декоратор, в котором не будет вводимых аргументов. Как правило, для этого нужно создать функцию декоратора, которая и станет вводимым аргументом. Следовательно, функция, которая будет декорироваться, будет выступать вводом функции декоратора.
Далее создается функция оболочки внутри функции декоратора, которая будет выполнять такую же задачу. Затем функция декоратора вернет функцию оболочки с обновленным функционалом. Это покажем в следующем примере.
Здесь надо разместить функцию, которая вводится, в переменную result, после чего вернуть f-строку этой переменной.
def my_decorator(function): def wrapper(*args, **kwargs): result = function(*args, **kwargs) return f'Adding some text in the decorator\n{result}' return wrapper
Итак, в процессе декорирования исходной функции с функцией my_decorator можно обнаружить, что изменилась выдача декорируемой функции.
Python @my_decorator def my_decorated_function(input): return input print(my_decorated_function('Hello, World!'))
Ну и таким будет результат вывода в этом примере.
Adding some text in the decorator Hello, World!
Декоратор с аргументом Python
Очень часто времени на создание кода недостаточно, и поэтому нежелательно делать его структуру менее простой для понимания. Сейчас попробуем показать наглядно, что лучше акцентировать внимание не на тексте вывода, а на возможности контроля процесса внесения аргумента в декоратор.
Сперва это может показаться довольно непросто. Чтобы самостоятельно изучать этот материал, потребуется потратить немало часов на поиск информации и ее обработку.
В предыдущем примере была получена функция внутри функции. Теперь будет несколько усложнена задача – нам понадобится функция внутри функции, которая в том числе расположена внутри функции. Звучит сложно, но нижеприведенный фрагмент кода наглядно все объяснит.
Подобные примеры уже есть в других языках разработки приложений. Тем не менее, тем, кто начал изучать Python-разработку, это будет чем-то новым. Итак, функция декоратора может быть следующей.
def my_decorator(input_arg): def the_real_decorator(function): def wrapper(*args, **kwargs): result = function(*args, **kwargs) return f'{input_arg}\n{result}\n{input_arg}' return wrapper return the_real_decorator
Теперь можно внести аргумент в декоратор, который будет использоваться внутри функции декоратора. Следовательно, итоговая функция примет аргумент из декоратора, а вложенная функция, которая является следующей, примет декорируемую функцию в качестве вывода (как в первом примере). Затем у нее появляется способность использовать ввод из итоговой функции.
Сперва надо вернуть функцию wrapper функции the_real_decorator, а потом вернуть the_real_decorator действующей функции декоратора.
Многим этот процесс может показаться непонятным. Тем не менее, учитывая то, что здесь применяется декоратор с аргументом, становится понятным, что аргумент реально работает.
@my_decorator('-------------') def my_decorated_function(input): return input print(my_decorated_function('Hello, World!')) ------------- Hello, World! -------------
Заключение
Таким образом, мы разобрали очень простой вариант, как можно использовать аргументы с функцией декоратора. Использоваться может один или несколько из них. Также мы рассмотрели пример использования декоратора Python без аргумента.