设置函数的python递归限制

jse*_*old 11 python recursion

我有一个解决递归问题的解决方案,我需要一个函数(实际上是一个方法).我希望它是递归的,但是我想将递归限制设置为10并在调用函数后重置它(或者根本没有使用递归限制).任何人都可以想到一个更好的方法来做这个或建议使用其中一个吗?我倾向于上下文管理器,因为它保持我的代码更清洁,没有设置tracebacklimit,但可能有警告?

import sys

def func(i=1):
    print i
    if i > 10:
        import sys
        sys.tracebacklimit = 1
        raise ValueError("Recursion Limit")
    i += 1
    func(i)

class recursion_limit(object):
    def __init__(self, val):
        self.val = val
        self.old_val = sys.getrecursionlimit()
    def __enter__(self):
        sys.setrecursionlimit(self.val)
    def __exit__(self, *args):
        sys.setrecursionlimit(self.old_val)
        raise ValueError("Recursion Limit")

def func2(i=1):
    """
    Call as

    with recursion_limit(12):
        func2()
    """
    print i
    i += 1
    func2(i)

if __name__ == "__main__":
    #    print 'Running func1'
    #    func()

    with recursion_limit(12):
        func2()
Run Code Online (Sandbox Code Playgroud)

我确实通过上下文管理器看到了一些奇怪的行为.如果我放入主要

with recursion_limit(12):
    func2()
Run Code Online (Sandbox Code Playgroud)

它打印1到10.如果我从解释器那样做它打印1到11.我认为当我导入东西时,引擎盖下有什么东西?

编辑:对于后人来说,这是我想出的一个知道其调用深度的函数.我怀疑我会在任何生产代码中使用它,但它完成了工作.

import sys
import inspect
class KeepTrack(object):
    def __init__(self):
        self.calldepth = sys.maxint

    def func(self):
        zero = len(inspect.stack())
        if zero < self.calldepth:
            self.calldepth = zero
        i = len(inspect.stack())
        print i - self.calldepth
        if i - self.calldepth < 9:
            self.func()

keeping_track = KeepTrack()
keeping_track.func()
Run Code Online (Sandbox Code Playgroud)

Ned*_*der 7

您根本不应该更改系统递归限制.你应该编写你的函数来知道它的深度,并在它变得太深时结束递归.

递归限制似乎在程序和解释器中应用不同的原因是因为它们具有不同的堆栈顶部:在解释器中调用的函数可以运行代码.