Как передать параметр в декоратор в рантайме?

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

Рассмотрим пример:

def make_decorator(param):
    def decorator(func):
        def wrapper(*args, **kwargs):
            print(f"Параметр декоратора: {param}")
            result = func(*args, **kwargs)
            return result
        return wrapper
    return decorator

@make_decorator("Привет")
def say_hello(name):
    print(f"Привет, {name}!")

say_hello("Миша")

В данном примере мы определили функцию make_decorator, которая принимает параметр param. Затем внутри make_decorator определяется функция decorator, которая является декоратором. Внутри декоратора decorator определяется функция wrapper, которая выполняет код до и после вызова оборачиваемой функции func.

Когда мы применяем декоратор make_decorator к функции say_hello, мы передаем строку "Привет" в качестве параметра. Эта строка передается внутрь декоратора во время исполнения.

При вызове функции say_hello("Миша") будет выполнен декоратор wrapper, который в свою очередь печатает переданный параметр декоратора и вызывает оборачиваемую функцию func.

В результате выполнения программы будет выведено:

Параметр декоратора: Привет
Привет, Миша!

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