Это продолжение предыдущего поста Декораторы в python.
Ранее мы передавали функцию display
в функцию декоратора. Но что если у функции display
есть аргументы, которые она принимает?
def decorator_function(original_function):
def wrapper_function():
#do something before the function
print("hello from wrapper")
return original_function()
return wrapper_function
#this works same as decorator_function(display)
@decorator_function
def display():
print("hello from display")
display()
Передача аргументов в декораторы
Давайте передадим несколько аргументов в display
и посмотрим, что произойдет.
@decorator_function
def display(name, age):
print(f"hello from {name}. I am {age} years old.")
display("Dev", 15)
Вывод
TypeError: wrapper_function() takes 0 positional arguments but 2 were given
Выдается ошибка, потому что сейчас функция-обертка не может принимать аргументы. Это можно исправить, используя *args
и **kwargs
.
def decorator_function(original_function):
def wrapper_function(*args, **kwargs):
#do something before the function
print("hello from wrapper")
return original_function(*args, **kwargs)
return wrapper_function
#this works same as decorator_function(display)
@decorator_function
def display():
print(f"hello from {name}. I am {age} years old.")
display("Dev", 15)
*args
позволяет нам передавать любое количество позиционных аргументов, а **kwargs
позволяет нам передавать любое количество аргументов ключевых слов в wrapper_function
. Теперь мы можем передать любое количество аргументов в нашу декорированную функцию.
Вывод
hello from wrapper
hello from dev. I am 15 years old
Спасибо за чтение и обучение.