Назад к вопросам
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__ |
Нет | Ссылка на оригинальную функцию |