from functools import wraps @wraps(wrapped, assigned=WRAPPER_ASSIGNMENTS, updated=WRAPPER_UPDATES)
wrapped
- исходная функция,assigned
- какие атрибуты исходной функции присваиваются декоратору,updated
- какие атрибуты декоратора обновляются из исходной функции.Декоратор @wraps()
модуля functools
это удобная функция для вызова @functools.update_wrapper()
в качестве декоратора при определении функции-обертки.
Декоратор @wraps()
частично эквивалентно вызову partial(update_wrapper, wrapped=wrapped, assigned=assigned, updated=updated)
.
Необязательные аргументы (assigned
и updated
) - это кортежи, указывающие, какие атрибуты исходной функции wrapped
назначаются непосредственно соответствующим атрибутам декоратору, а какие атрибуты декоратора обновляются соответствующими атрибутами из исходной функции wrapped
.
Значения по умолчанию для этих аргументов - это константы уровня модуля:
WRAPPER_ASSIGNMENTS
- присваивает функции обертке __module__
, __name__
, __qualname__
, __annotations__
и __doc__
.WRAPPER_UPDATES
- обновляет в функции обертке __dict__
.Без использования этой фабрики декораторов имя функции example.__name__
было бы 'wrapper'
, а строка документации example()
была бы потеряна.
from functools import wraps def my_decorator(f): @wraps(f) def wrapper(*args, **kwds): print('Calling decorated function') return f(*args, **kwds) return wrapper @my_decorator def example(): """Docstring""" print('Called example function') >>> example() # Calling decorated function # Called example function >>> example.__name__ 'example' >>> example.__doc__ 'Docstring'