所以这是这个问题的扩展: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)
打开装饰器选项或不使用该选项。无论如何,无论设计好坏,如何在递归调用中调用装饰器?
答案 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>