Вопрос проверяет понимание внутреннего устройства декораторов и причин потери метаданных функций.
Без wraps декоратор возвращает новую функцию-обёртку, которая полностью заменяет исходную. Python не копирует метаданные автоматически. В результате имя, docstring и сигнатура функции теряются. Это может ломать инструменты, использующие introspection.
Потеря метаданных — это прямое следствие того, как работают декораторы.
Декоратор:
принимает функцию
создаёт новую функцию (wrapper)
возвращает её вместо исходной
Для интерпретатора:
оригинальная функция больше не видна
доступен только wrapper
Без wraps у функции пропадают:
__name__
__doc__
__annotations__
информация о сигнатуре
Это особенно критично для:
фреймворков
декораторов декораторов
автогенерации документации
wraps:
копирует метаданные исходной функции
сохраняет ссылку на неё в __wrapped__
делает декоратор «прозрачным»
Пример:
from functools import wraps
def dec(func):
@wraps(func)
def wrapper(*args, **kwargs):
return func(*args, **kwargs)
return wrapper
Без wraps:
отладка усложняется
introspection работает некорректно
инструменты могут ломаться без явной ошибки
functools.wraps необходим для сохранения метаданных и корректной работы декораторов в реальных проектах.