类的栈空间怎么如此快抛出异常?

2018-10-07 23:21:39 +08:00
 sosei

` 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 时候抛出异常

596 次点击
所在节点    问与答
0 条回复

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/495430

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX