如何使装饰器在递归函数调用中被调用?
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
所以这里是这个问题的扩展:
在这些方面,我想出了这样的方法来使装饰器在递归调用中被调用:
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