В данной статье показан простой пример создания функции декоратора, которая принимает и использует один или несколько аргументов. Декоратор, который будет принимать аргументы, будет выглядеть следующим образом.
1 2 3 |
@mydecorator(my_argument) def my_decorated_function(input): return input |
В качестве наиболее простого примера можно рассмотреть вывод некой информации до и после ввода функции.
1 2 3 4 5 |
@mydecorator('-------------------') def my_decorated_function(input): return input print(my_decorated_function('Hello, World!') |
В данном случае вывод будет представлен следующим образом.
Есть вопросы по Python?
На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!
Паблик VK
Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!
1 2 3 4 5 |
------------------- Hello, World! ------------------- |
Python декоратор без аргументов
В качестве примера рассмотрим декоратор без вводимых аргументов. Обычно для этого требуется создать функцию декоратора, которая станет вводимым аргументом. Таким образом, функция, которую вы декорируете, будет вводом функции декоратора.
Затем создается функцию оболочки внутри функции декоратора, которая будет выполнять аналогичную задачу. После этого функция декоратора вернет функцию оболочки с обновленным функционалом. Это будет показано в следующем примере. Здесь требуется поместить вводимую функцию в переменную result
, а затем вернуть f-строку с этой переменной.
1 2 3 4 5 |
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
можно увидеть, что выдача декорируемой функции меняется.
1 2 3 4 5 |
@my_decorator def my_decorated_function(input): return input print(my_decorated_function('Hello, World!')) |
Результат вывода в данном случае будет следующим:
1 2 |
Adding some text in the decorator Hello, World! |
Python декоратор с аргументом
Зачастую время на составление кода весьма ограничено, и усложнять его структуру совсем не хочется. В данном примере показано, что оптимальнее будет сосредоточиться не на тексте вывода, а на возможности проконтролировать процесс внесения аргумента в декоратор. Поначалу это может быть достаточно сложным. Для самостоятельного изучения потребуются многие часы поиска актуальной информации в сети и согласования ее в уме.
В результате прошлого примера была получена функция внутри функции. Теперь задача несколько усложнится — нам потребуется функция внутри функции, которая также находится внутри функции. Примеры подобного могут встречаться и в других языка программирования. Однако тем, кто начал изучать программирование с Python, это будет в новинку. Итак, функция декоратора может выглядеть следующим образом.
1 2 3 4 5 6 7 8 9 |
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
действующей функции декоратора.
Многим данный процесс может показаться несколько странным. Однако, ввиду того, что здесь используется декоратор с аргументом, становится очевидным, что аргумент действительно работает.
1 2 3 4 5 |
@my_decorator('-------------') def my_decorated_function(input): return input print(my_decorated_function('Hello, World!')) |
1 2 3 |
------------- Hello, World! ------------- |
Заключение
В данной статье был представлен наиболее простой способ использования одного или нескольких аргументов с функцией декортора в Python.
Являюсь администратором нескольких порталов по обучению языков программирования Python, Golang и Kotlin. В составе небольшой команды единомышленников, мы занимаемся популяризацией языков программирования на русскоязычную аудиторию. Большая часть статей была адаптирована нами на русский язык и распространяется бесплатно.
E-mail: vasile.buldumac@ati.utm.md
Образование
Universitatea Tehnică a Moldovei (utm.md)
- 2014 — 2018 Технический Университет Молдовы, ИТ-Инженер. Тема дипломной работы «Автоматизация покупки и продажи криптовалюты используя технический анализ»
- 2018 — 2020 Технический Университет Молдовы, Магистр, Магистерская диссертация «Идентификация человека в киберпространстве по фотографии лица»