Реализация декоратора с параметрами в Python

Нужны фабрика с параметрами, декоратор и wrapper с *args/**kwargs. functools.wraps сохраняет метаданные исходной функции, а замыкание передаёт настройку обёртке.

Короткий ответ

Что ответить на собеседовании

Нужны фабрика с параметрами, декоратор и 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.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее