使用Python装饰器跟踪递归深度 [英] Tracking recursion depth with Python decorators

查看:67
本文介绍了使用Python装饰器跟踪递归深度的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I am trying to write a decorator that tracks the recursion depth of a recursive function in Python.

例如,使用


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

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

Usually, to track recursion depth you could write something like so


    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)

但是,在与装饰者摆弄了一段时间并进行了很多搜索之后,我不确定这是否有可能.

However, after fiddling around with decorators for a while and a lot of googling, I'm not sure this is even possible.

我尝试过类似的事情


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)

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

But it complains that count is an unexpected keyword argument, which I don't really understand because I was under the impression that the wrapper modify replaces all occurrences of fib but I guess not?

指针将不胜感激.

推荐答案

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

You can specify level variable for decorator and then use it in function calls like this:

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

这篇关于使用Python装饰器跟踪递归深度的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆