все Python 3functoolsпонятие
functools.wraps
декораторы
Копирует метаданные декорируемой функции (__name__, __doc__, __annotations__) в функцию-обёртку. Обязателен при написании декораторов.
Синтаксис
@functools.wraps(wrapped)
Забудете — и обёртка начнёт представляться чужим именем: help() и __name__ покажут wrapper, сломаются doctest'ы, автодокументация и любые реестры, где ключом служит имя функции. При этом wraps чинит только интроспекцию: вызываться по-прежнему будет wrapper(*args, **kwargs), просто inspect.signature пройдёт по проставленному __wrapped__ и покажет сигнатуру оригинала.
Примеры
from functools import wraps
def my_decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
return func(*args, **kwargs)
return wrapper
@my_decorator
def greet(name):
"""Say hello."""
return f'Hello, {name}'
print(greet.__name__) # → greet
print(greet.__doc__) # → Say hello.
print(greet('Alice')) # → Hello, Alice
print(greet.__wrapped__) # → ? repr функции содержит адрес
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности