Количество вызовов рекурсивной функции с Python-декораторами - PullRequest
3 голосов
/ 12 марта 2019

У меня есть следующий фрагмент кода о функциональных декораторах , где я хотел инициализировать переменную wrapper.calls равной 0 со второго раза, когда я вызываю fib(), зная, что при первом запуске это дает правильный ответ и после, он ведет себя как суммирование предыдущих результатов. У меня вопрос, как это исправить при смене только декоратора-профилировщика, пожалуйста?

Вот мой код:

from functools import wraps
import time


def profiler(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        wrapper.calls += 1
        return func(*args, **kwargs)
    wrapper.calls = 0
    return wrapper

@profiler
def fib(n):
    if n == 0:
        return 0
    if n == 1:
        return 1
    else:
        return fib(n-1) + fib(n-2)


fib(1)
print(fib.calls)
fib(2)
print(fib.calls)

Вывод этой программы после выполнения:

1
4

Ожидаемый результат

1 
3

1 Ответ

0 голосов
/ 12 марта 2019

Поскольку calls = 0 инициализируются только в fib = profiler(fib).

Если вы только выполните

fib(2)
print(fib.calls)

, это будет 3

или

for input_n in (1, 2):
    fib = profiler(fib)
    fib(input_n)
    print(fib.calls)

Будет то, что вы ожидаете

1
3
...