V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
sosei
V2EX  ›  问与答

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

  •  
  •   sosei · 2018-10-07 23:21:39 +08:00 · 595 次点击
    这是一个创建于 2199 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1089 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 18:28 · PVG 02:28 · LAX 11:28 · JFK 14:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.