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

发布于 2022-09-07 23:38:29 字数 2003 浏览 38 评论 0

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文