Назад к вопросам
Middle
67
questionbank

Для чего используется декоратор wraps в Python?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Декоратор wraps из модуля functools используется для сохранения метаданных оборачиваемой функции (таких как имя, docstring, аннотации и модуль) при создании функции-обертки.

Без wraps, обернутая функция будет иметь метаданные функции-обертки, что может затруднить отладку, интроспекцию и использование инструментов (например, Sphinx для документации).

from functools import wraps

def my_decorator(func):
    # Сохраняет метаданные оригинальной функции
    @wraps(func)
    def wrapper(*args, **kwargs):
        print("Before function call")
        result = func(*args, **kwargs)
        print("After function call")
        return result
    return wrapper

@my_decorator
def greeted_function(name):
    """This is the docstring of the greeted function."""
    print(f"Hello, {name}!")

# Без wraps, greeted_function.__name__ был бы 'wrapper',
# greeted_function.__doc__ был бы None, и т.д.
print(f"Function name: {greeted_function.__name__}")
print(f"Function docstring: {greeted_function.__doc__}")

greeted_function("World")

Итоговая таблица для сравнения:

Атрибут Без functools.wraps С functools.wraps
__name__ Имя функции-обертки Имя оригинальной функции
__doc__ Docstring функции-обертки Docstring оригинальной функции
__module__ Модуль функции-обертки Модуль оригинальной функции
__annotations__ Аннотации функции-обертки Аннотации оригинальной функции
__wrapped__ Нет Ссылка на оригинальную функцию