微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python中装饰器的计数调用和最大递归深度

如何解决python中装饰器的计数调用和最大递归深度

我想要一个有两个字段的装饰器,比如 .ncalls.rdepth。当它包装一个函数时,ncalls 应该计算函数调用自身的次数,如果函数是递归的,rdepth 应该表示达到的最大递归深度。 我已经尝试过类似这里 (https://stackoverflow.com/a/51690214/12313533) 的方法,但它不起作用。 我的代码现在看起来像是前面提到的代码和使用装饰器计算函数调用代码的混合体:

def call_counter(func): #a decorator to count calls
    def helper(x):
        helper.calls += 1
        return func(x)
    helper.calls = 0
    return helper

所以我需要这样的东西(这不起作用):

def depthcounter(func):
     def wrapper(*args,**kwargs):
         wrapper.rdepth += 1
         wrapper.ncalls += 1
         result = func(*args,**kwargs)
         return result
     wrapper.ncalls = 0
     wrapper.rdepth = 0
     return wrapper

例如,假设我有一个阶乘函数,如

@depthcounter
def factorial(n):
    if n <= 1:
        return 1
    else:
        return n * factorial(n - 1)

#Here is some working code

print(factorial.ncalls,factorial.rdepth)
factorial(4)
print(factorial.ncalls,factorial.rdepth)
factorial(10)
print(factorial.ncalls,factorial.rdepth)
print(factorial.ncalls,factorial.rdepth)
factorial(20)
print(factorial.ncalls,factorial.rdepth)
factorial(2)
print(factorial.ncalls,factorial.rdepth)

我需要装饰器来制作这个:

0 0
4 4
10 10
10 10
20 20
2 2

但我得到了这个:

0 0
4 4
14 14
14 14
34 34
36 36

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。