Bottle框架出现Maximum Recursion Depth Exceeded错误求调试建议
解决Maximum Recursion Depth Exceeded错误的调试建议
嘿,我一眼就揪出问题所在了——你遇到的递归超限错误完全是函数命名冲突导致的无限递归!
问题根源分析
你定义了两个同名的Subjects函数:
- 第一个是负责查询数据库、返回科目数据的工具函数
- 第二个是Flask的路由处理函数,用来响应
/subjects请求
当用户访问/subjects时,路由函数Subjects()内部调用了Subjects()——这时候Python会认为你在调用当前的路由函数本身,而不是第一个数据查询函数。于是就陷入了“路由函数调用自己→再调用自己→再调用自己……”的无限循环,直到触发Python的递归深度上限。你调高递归限制后出现段错误,是因为栈内存被耗尽了,这是硬件层面的限制,根本解决不了逻辑问题。
修复方案:给函数重命名,区分功能
只需要把两个函数的名字区分开,就能彻底解决问题。建议遵循PEP8规范,用小写字母加下划线命名函数,让代码更易读:
def runSQL(sql): db = sqlite3.connect('zadanie.db') c = db.cursor() c.execute(sql) data = c.fetchall() db.commit() c.close() return data # 重命名数据查询函数,明确它的功能 def get_subjects(): sql = "SELECT (here is my query)" data = runSQL(sql) return data @app.route('/subjects') def subjects(): # 调用重命名后的查询函数,避免混淆 sub = template('look4.html', rows=get_subjects()) return sub
额外调试建议
- 遇到递归错误时,先检查函数调用链:看看是不是有函数直接/间接调用了自己
- 永远不要随意调高递归限制:Python的递归设计本来就不适合处理无限循环场景,调高限制只会掩盖逻辑错误,最终导致栈溢出
- 调试时可以加打印语句:比如在每个函数开头加
print("我是数据查询函数")或print("我是路由函数"),快速定位当前调用的是哪个函数 - 养成良好的命名习惯:用有意义的名字区分不同功能的函数,避免重名混淆
内容的提问来源于stack exchange,提问作者mandarti
相关产品推荐
相关产品推荐

