Декораторы часть II

Это продолжение предыдущего поста Декораторы в 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
Вход в полноэкранный режим Выход из полноэкранного режима

Спасибо за чтение и обучение.

Оцените статью
devanswers.ru
Добавить комментарий