Превышен предел глубины рекурсии при использовании декоратора

def decorator(n):

    def inner_decorator(func):

        def wrapper(b):

            ppp(b)

            print(f"hello {n}")

        return wrapper

    return inner_decorator


@decorator("beta")
def ppp(b):

    print(f"hello {b}")

ppp("alpha")

При запуске данного кода возникает ошибка, а еще не используется функция декоратора inner_decorator, в которую передается в качестве аргумента функция ppp(). Подскажите пожалуйста что делать.


Ответы (1 шт):

Автор решения: CrazyElf
def decorator(n):
    def inner_decorator(func):
        def wrapper(b):
            ppp(b) # <-- ТУТ ПРОБЛЕМА
            print(f"hello {n}")
        return wrapper
    return inner_decorator

Так вы рекурсивно вызываете задекорированную функцию ppp (а значит и сам декоратор) прямо внутри декоратора! Вызывайте исходную, не декорированную функцию, она передана внутреннему декоратору через параметр func:

def decorator(n):
    def inner_decorator(func):
        def wrapper(b):
            func(b) # <-- ВОТ ТАК ПРАВИЛЬНО
            print(f"hello {n}")
        return wrapper
    return inner_decorator

@decorator("beta")
def ppp(b):

    print(f"hello {b}")

ppp('123')

Вывод:

hello 123
hello beta
→ Ссылка