Sobes.tech
Middle
164

Wofür wird der Decorator wraps in Python verwendet?

Antwort von AI

sobes.tech KI

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