使用 Python 装饰器跟踪递归深度

Joo*_*Son 4 python recursion decorator

我正在尝试编写一个装饰器来跟踪Python中递归函数的递归深度。

以递归函数为例,例如


def fib(n):
    if n == 0:
        return 0
    if n == 1:
        return 1
    else:
        return fib(n-1) + fib(n-2)
Run Code Online (Sandbox Code Playgroud)

通常,要跟踪递归深度,您可以编写如下内容


    def fib(n, level=0):
        print(level)
        if n == 0:
            return 0
        if n == 1:
            return 1
        else:
            return fib(n-1, level=level+1) + fib(n-2, level=level+1)
Run Code Online (Sandbox Code Playgroud)

然而,在摆弄装饰器一段时间并进行大量谷歌搜索之后,我不确定这是否可能。

我尝试过类似的事情


def visualise(func):
    def modify(*args, **kwargs):
        kwargs["count"] += 1
        print(kwargs["count"])
        return func(*args, **kwargs)

    return modify

@visualise
def fib(n):
    ...

fib(4, count=0)
Run Code Online (Sandbox Code Playgroud)

但它抱怨这count是一个意外的关键字参数,我不太明白,因为我的印象是包装器modify替换了所有出现的fib但我想不是?

指针将不胜感激。

Lev*_*rov 6

您可以为装饰器指定级别变量,然后在函数调用中使用它,如下所示:

def visualise(func):
     visualise.level = 0
     def wrapper(*args, **kwargs):
         print("In:", visualise.level)
         visualise.level += 1
         result = func(*args, **kwargs)
         visualise.level -= 1
         print("Out:", visualise.level)
         return result
     return wrapper
Run Code Online (Sandbox Code Playgroud)