如何在递归函数调用上调用decorator?

时间:2016-06-12 11:04:13

标签: python recursion python-decorators

所以这是这个问题的扩展:https://stackoverflow.com/a/37568895/2290820 关于如何在函数上选择性地启用或禁用装饰器。

在这些方面,我想出了类似的东西,以便在递归调用中调用decorator:

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)

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

1 个答案:

答案 0 :(得分:1)

deco f.attr = attr,您的作业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 表示"吃掉"第一次递归调用后的参数。你应该这样修改你的递归调用:

<a>