gpt4 book ai didi

python - 为函数设置python递归限制

转载 作者:太空狗 更新时间:2023-10-29 18:06:19 27 4
gpt4 key购买 nike

对于函数(实际上是方法)所需的递归问题,我有 2 个解决方案。我希望它是递归的,但我想将递归限制设置为 10 并在调用函数后将其重置(或者根本不混淆递归限制)。谁能想出更好的方法来做到这一点或推荐使用一种方法而不是其他方法?我倾向于使用上下文管理器,因为它可以使我的代码更简洁并且无需设置回溯限制,但可能有一些注意事项?

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()

虽然使用上下文管理器,但我确实看到了一些奇怪的行为。如果我输入 main

with recursion_limit(12):
func2()

它打印出 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()

最佳答案

您根本不应该更改系统递归限制。您应该编写您的函数以了解它有多深,并在它变得太深时结束递归。

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

关于python - 为函数设置python递归限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6945620/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com