如何获得Python解释器堆栈的当前深度?


问题内容

文档中

sys.getrecursionlimit()

返回递归限制的当前值,即Python解释器堆栈的最大深度。
此限制可防止无限递归导致C堆栈溢出和Python崩溃。可以通过setrecursionlimit()进行设置。

我目前在腌制对象时达到了递归限制。我正在腌制的对象只有几个层次的嵌套,所以我对正在发生的事情感到有些困惑。

我可以通过以下黑客措施来解决此问题:

try:
    return pickle.dumps(x)
except:
    try:
        recursionlimit = getrecursionlimit()
        setrecursionlimit(2*recursionlimit)
        dumped = pickle.dumps(x)
        setrecursionlimit(recursionlimit)
        return dumped
    except:
        raise

在不同的环境中测试以上代码片段有时会在第一个上获得成功try,有时会在第二个上获得成功try。到目前为止,我还无法将其设为raise例外。

为了进一步调试我的问题,有一种获取当前堆栈深度的方法将很有帮助。这将使我能够验证输入的堆栈深度是否正在确定上面的代码片段将在第一个try还是第二个上成功。

标准库是否提供获取堆栈深度的功能,否则,如何获得堆栈的深度?

def get_stack_depth():
    # what goes here?

问题答案:

您可以从中看到整个调用堆栈inspect.stack(),因此当前采用的深度为len(inspect.stack(0))

另一方面,我想当引发 “超出最大递归深度” 异常时,您可以打印出完整的堆栈。该堆栈跟踪应该向您确切显示出了什么问题。