functools.wraps переносит метаданные исходной функции на wrapper и сохраняет ссылку wrapped. Без него имя, документация и интроспекция обычно описывают обёртку, а не исходную функцию.
Что такое декоратор functools.wraps, зачем он применяется к wrapper и что будет без него?
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 и не делает синхронную функцию автоматически асинхронной. Аргументы, результат и исключения всё равно нужно передавать корректно.