Что такое декоратор functools.wraps, зачем он применяется к wrapper и что будет без него?

functools.wraps переносит метаданные исходной функции на wrapper и сохраняет ссылку __wrapped__. Без него имя, документация и интроспекция обычно описывают обёртку, а не исходную функцию.

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

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

functools.wraps переносит метаданные исходной функции на wrapper и сохраняет ссылку wrapped. Без него имя, документация и интроспекция обычно описывают обёртку, а не исходную функцию.

Подробный разбор

Ответ с пояснениями

functools.wraps переносит метаданные исходной функции на wrapper и сохраняет ссылку wrapped. Без него имя, документация и интроспекция обычно описывают обёртку, а не исходную функцию.

Пример:

from functools import wraps

def trace(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        return func(*args, **kwargs)
    return wrapper

Это полезно для документации, отладки и инструментов, раскрывающих цепочку декораторов. wraps не исправляет ошибочную логику wrapper и не делает синхронную функцию автоматически асинхронной. Аргументы, результат и исключения всё равно нужно передавать корректно.

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

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

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

Подробнее