Сообщить об ошибке.

Декоратор @wraps() модуля functools в Python

Заменить атрибуты декоратора на атрибуты исходной функции

Синтаксис:

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'