functools.wraps
Декоратор для оборачивающих функций, копирующий метаданные (__name__, __doc__ и др.) с исходной функции на обёртку.
Сигнатура
@functools.wraps(wrapped)Без wraps декорированная функция теряет своё имя и строку документации — снаружи виден внутренний wrapper. wraps восстанавливает корректные метаданные.
from functools import wraps
def logged(func):
@wraps(func)
def wrapper(*args, **kwargs):
print('вызов', func.__name__)
return func(*args, **kwargs)
return wrapper
@logged
def greet():
"""Здоровается."""
return 'привет'
print(greet.__name__) # 'greet' (а не 'wrapper')
print(greet.__doc__) # 'Здоровается.'