Нужны фабрика с параметрами, декоратор и wrapper с *args/**kwargs. functools.wraps сохраняет метаданные исходной функции, а замыкание передаёт настройку обёртке.
Реализация декоратора с параметрами в Python
Нужны фабрика с параметрами, декоратор и wrapper с *args/**kwargs. functools.wraps сохраняет метаданные исходной функции, а замыкание передаёт настройку обёртке.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо создать декоратор, который позволяет принимать пользовательские параметры и использовать их внутри оборачиваемой функции. Декоратор должен корректно работать с произвольным числом позиционных и именованных аргументов, а также сохранять метаданные оригинальной функции.
Ответ
Нужны фабрика с параметрами, декоратор и wrapper с *args/**kwargs. functools.wraps сохраняет метаданные исходной функции, а замыкание передаёт настройку обёртке.
Пример:
from functools import wraps
def multiply_result(factor):
def decorate(func):
@wraps(func)
def wrapper(*args, **kwargs):
return func(*args, **kwargs) * factor
return wrapper
return decorate
@multiply_result(2)
def add(a, b=0):
return a + b
assert add(3, b=4) == 14
Функция вызывается один раз, factor используется обёрткой. Результат должен поддерживать умножение. Это синхронный вариант; для async-функции wrapper должен ожидать результат через await.