Этот вопрос проверяет знание роли functools.wraps в создании декораторов и его влияния на метаданные функции.
functools.wraps используется для сохранения оригинальных метаданных функции (таких как её имя, строка документации, сигнатура) при её декорировании. Без wraps декорированная функция может потерять эти данные, так как заменяется новой функцией, созданной декоратором.
Декораторы в Python заменяют оригинальную функцию новой функцией. При этом имя, документация и другие атрибуты оригинальной функции могут быть потеряны. functools.wraps копирует эти атрибуты с оригинальной функции на декоратор.
Пример:
from functools import wraps
def my_decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
print("Декоратор сработал!")
return func(*args, **kwargs)
return wrapper
@my_decorator
def say_hello():
"""Говорит привет."""
return "Hello!"
print(say_hello.__name__) # say_hello
print(say_hello.__doc__) # Говорит привет.Без @wraps вместо оригинального имени функции say_hello и её документации будет отображаться информация о функции wrapper.