如何使装饰器在递归函数调用中被调用?

How To make decorator get invoked on a recursive function call?

所以这里是这个问题的扩展: 关于如何有选择地在函数上启用或禁用装饰器。

在这些方面,我想出了这样的方法来使装饰器在递归调用中被调用:

def deco(f):
    def fattr(attr):
        f.attr = attr
        def closure(*args):
            f(*args)
        f.unwrap = f
        f.closure = closure
        return f
    return fattr

@deco
def printa(x):
    if x > 1:
        print x
        return printa(x-1)
    else:
        print x
    return

printa({1:1})(5)

# do the same call w/o deocorator
def finta(x):
    if x > 1:
        print x
        return finta(x-1)
    else:
        print x
    return

finta(5) # this works

在递归函数上试验装饰器。显然,printa 递归版本没有按应有的方式运行。

我可以

g = printa({1:1})
g.closure(5)

打开装饰器选项或不使用该选项。无论如何,无论设计好坏,如何使装饰器在递归调用中被调用?

在您的 deco 中,您有一个赋值 f.attr = attr "eats" 您在第一次递归调用后的参数。你应该这样修改你的递归调用:

def deco(f):
    def fattr(attr):
        f.attr = attr
        def closure(*args):
            f(*args)
        f.unwrap = f
        f.closure = closure
        return f
    return fattr

@deco
def printa(x):
    if x > 1:
        print x
        return printa(None)(x-1) # None will be assigned to f.attr
    else:
        print x
    return

printa({1:1})(5)

5
4
3
2
1