使用swagger-py-codegen时dpath的segments.py调用isinstance出现无限递归
问题根因
这个无限递归的根本原因是两个因素叠加:
- 你的OpenAPI定义文件中存在循环引用(包括自引用,比如某个Schema的属性类型指向自身,或两个Schema互相通过
$ref引用对方) - 你当前使用的
dpath依赖包版本过旧,遍历JSON结构时未做循环引用检测,碰到递归结构就会进入无限递归,最终触发递归深度超限报错。你修改递归深度的操作没有解决根本的循环问题,所以会一直无响应。
解决方案
- 第一步:清理OpenAPI文档中的循环引用
遍历你的OpenAPI定义,排查所有$ref字段的指向,确认是否存在互相引用、自引用的场景。如果是业务必须保留的循环引用,可临时将其中一端的引用替换为直接编写属性定义,待生成代码后再手动调整对应逻辑。 - 第二步:升级
dpath依赖到最新版本
新版本dpath已内置循环引用检测逻辑,遍历到重复访问的对象时会直接终止递归,不会触发无限循环。执行以下命令升级即可:pip install --upgrade dpath - 第三步(兼容问题备选方案):替换代码生成工具
如果升级dpath后和swagger-py-codegen出现兼容报错,可更换为维护状态更活跃的OpenAPI客户端生成工具,这类工具对OpenAPI 3.x规范、循环引用场景的支持更加完善。 - 临时补丁方案:手动修改
dpath遍历逻辑
如果你不想调整文档也不想更换工具,可以直接修改dpath库的segments.py中的walk函数,增加已访问对象的检测逻辑,示例修改如下:
增加上述检测后,遍历到已访问过的对象时会直接跳过,避免无限递归。def walk(obj, location=(), visited=None): if visited is None: visited = set() obj_id = id(obj) if obj_id in visited: return visited.add(obj_id) # 原有walk逻辑保留不动
内容的提问来源于stack exchange,提问作者Derek1st
相关产品推荐
相关产品推荐

