` import sys
class dynamic_regulation_recursion_limit: def init(self, func): self.func = func self.Increased_limit = 1000
def __call__(self, *args, **kwargs):
while True:
try:
return self.func(*args, **kwargs)
except RecursionError:
print('x, y= ', *args)
print('stack= ', len(inspect.stack()))
print('self.recursionlimit= ', self.recursionlimit)
print()
self.recursionlimit = sys.getrecursionlimit() + self.Increased_limit
sys.setrecursionlimit(self.recursionlimit)
@dynamic_regulation_recursion_limit def testadd(x, y): if x==0: print(y) else: return testadd(x-1, y+1) ` testadd(999, 0)
运行打印出的结果很出乎我意料 x, y= 669 330 stack= 665 self.recursionlimit= 1000
x, y= 335 664 stack= 1333 self.recursionlimit= 2000
x, y= 2 997 stack= 1999 self.recursionlimit= 3000
每次 RecursionError 时,len(inspect.stack())显示都距离 recursionlimit 远着呢
怎么回事???
def dynamic_regulation_recursion_limit(func): def wrapper(*args, **kwargs): while True: try: return func(*args, **kwargs) except RecursionError: print('x, y= ', *args) print('stack= ', len(inspect.stack())) print('self.recursionlimit= ', sys.getrecursionlimit()) print() recursionlimit = 1000 + sys.getrecursionlimit() sys.setrecursionlimit(recursionlimit) return wrapper
我一开始写的函数型装饰器
结果是正常的
x, y= 503 496
stack= 997
self.recursionlimit= 1000
x, y= 3 996 stack= 1997 self.recursionlimit= 2000
改写成类装饰器 输出结果就不理解了
stack= 665 self.recursionlimit= 1000
stack= 1333 self.recursionlimit= 2000
stack= 1999 self.recursionlimit= 3000
一个规律,都是到限制值 2/3 时候抛出异常
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.