为什么会出现python递归错误

6uxekuva  于 2023-01-03  发布在  Python
关注(0)|答案(1)|浏览(148)

我正在创建一个网页刮刀来浏览近400k的记录。基本上,它是这样工作的,我有一个CSV格式的部件号,需要在此站点上搜索。此站点有一个公开的API,因此我可以跳过前端,在登录后直接请求此站点。我创建了一个名为GetPdcResults的函数(),它接受一个部件列表和一个开始编号。start参数是为了如果刮刀因为任何原因停止,我可以在它在部件列表上离开的同一点重新启动它。然后scraper的主循环会枚举列表中的每个部分,为该部分构建一个有效负载并请求信息。如果我有网络错误或cookie错误,只有当我的用户会话过期时才会发生一些错误处理。然后调用CleanPdcResults()函数,清除站点返回的响应,并将相关信息保存为CSV格式以供导出。
据我所知,递归是指一个函数反复调用它自己,在python中这是有限制的,而且更耗费资源;迭代是指你使用一个循环来重复一组动作。
我想我希望在我的应用程序迭代,而不是递归,因为目前我a,得到这个错误,我从来没有见过。

RecursionError: maximum recursion depth exceeded while calling a Python object

我假设是因为我的函数中发生了递归而不是迭代,但我似乎不能指出这一点,函数调用自己的唯一时间是当出现cookie错误时,GetPdcResults()函数被再次调用,但不会被调用太多次而达到Limit。
有人能帮我找到我的剪贴板中递归发生的地方吗?我怎样才能把它转换成迭代来阻止这个错误?任何帮助都是感激的!
x一个一个一个一个x一个一个二个x

gcmastyq

gcmastyq1#

Python的默认值maximum recursion depth是1000,但是您可以使用 * print(sys.getrecursionlimit()) * 检查您的值,或者使用设置一个新值

# import sys
new_recursion_limit = 2000 # set as you prefer
sys.setrecursionlimit(new_recursion_limit)
# print('recursion limit is now', sys.getrecursionlimit())

但这被认为是一种危险的方法

相反,您应该考虑为GetPdcResults [或任何其他递归函数]设置额外的参数-类似于

def GetPdcResults(parts, start=0, maxDepth=999, curDepth=0):

然后在每次递归调用时递增curDepth,例如

# if response.status_code == 401:
            # logger.log_error('[-] Cookie Error', part=part)
            # print('\n[-] Cookie Error')
            if curDepth < maxDepth: 
                GetPdcResults(parts, start=i, maxDepth=maxDepth, curDepth=curDepth+1)
            ## else: print(curDepth, 'is too deep') # if you want an alternate action...
            # break

相关问题