Sobes.tech
Назад к вопросам
Junior — Middle
64

Каким образом в Python реализовать декоратор так, чтобы оригинальная функция оставалась доступной для вызова?

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

sobes.tech AI

Чтобы оригинальная функция оставалась доступной после применения декоратора, можно сохранить ссылку на неё как атрибут обёртки. Часто для этого используют functools.wraps, который копирует метаданные и сохраняет ссылку на оригинал в атрибуте __wrapped__.

Пример:

import functools

def my_decorator(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        print("Перед вызовом функции")
        result = func(*args, **kwargs)
        print("После вызова функции")
        return result
    return wrapper

@my_decorator
def greet(name):
    print(f"Привет, {name}!")

# Вызов декорированной функции

greet("Мир")

# Доступ к оригинальной функции
original = greet.__wrapped__
original("Мир")

Таким образом, greet.__wrapped__ — это оригинальная функция без декоратора.