Middle
160
¿Para qué se utiliza el decorador wraps en Python?
Respuesta de la IA
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__ |
Нет | Ссылка на оригинальную функцию |