Вкусные и сытные обертывания - Wraps
Модуль `wraps` в языке Python предоставляет декоратор, который облегчает сохранение метаданных о декорируемой функции. Обычно при декорировании функции, она теряет свои оригинальные метаданные, такие как имя, документацию или атрибуты. Однако, при использовании декоратора `wraps`, оригинальные метаданные сохраняются.
Рассмотрим пример, где функцию `add` декорируют два разных декоратора - `decorator1` и `decorator2`, однако только `decorator2` использует `wraps` для сохранения метаданных:
python
from functools import wraps
def decorator1(func):
def wrapper(*args, **kwargs):
print('Decorator 1')
return func(*args, **kwargs)
return wrapper
def decorator2(func):
@wraps(func)
def wrapper(*args, **kwargs):
print('Decorator 2')
return func(*args, **kwargs)
return wrapper
@decorator1
@decorator2
def add(a, b):
"""Функция для сложения двух чисел"""
return a + b
print(add.__name__) # Выводит "add"
print(add.__doc__) # Выводит "Функция для сложения двух чисел"
В этом примере, `decorator2` декорирует функцию `add` и использует `wraps(func)` для сохранения метаданных. Когда мы обращаемся к атрибутам декорированной функции `add`, таким как `__name__` и `__doc__`, они соответствуют оригинальной функции, хотя она была декорирована двумя разными декораторами.
Таким образом, модуль `wraps` позволяет сохранять оригинальные метаданные декорированных функций, делая код более читаемым и поддерживаемым.