使用pydantic-xml加载递归文件夹模型时遇递归深度超限错误
解决pydantic-xml递归读取文件夹XML时的RecursionError问题
问题场景
读取嵌套文件夹结构的XML文件时触发递归错误,错误信息:
RecursionError: maximum recursion depth exceeded in comparison
简化后的XML结构:
<Folder Name="rootfolder"> <Folder Name="subfolder"> <Folder Name="subsubfolder"></Folder> </Folder> <Folder Name="subfolder"> <Folder Name="subsubfolder"></Folder> </Folder> </Folder>
使用的代码(基于pydantic-xml库):
from __future__ import annotations class Folder(BaseXmlModel, tag="Folder"): name: Optional[str] = attr(name='Name') folder: Optional[List[Folder]] = element(tag='Folder') Folder.update_forward_refs()
此前用原生Pydantic处理同结构JSON时运行正常。
解决方案
调整模型字段定义,给子文件夹列表设置默认值,并规范字段名:
from __future__ import annotations from typing import Optional, List from pydantic_xml import BaseXmlModel, attr, element class Folder(BaseXmlModel, tag="Folder"): name: Optional[str] = attr(name='Name') folders: Optional[List[Folder]] = element(tag='Folder', default=None)
原因说明
- 原生Pydantic处理JSON的递归引用逻辑与pydantic-xml存在差异,后者需要显式设置默认值,避免递归实例化时触发无限递归。
- 原代码中未给子文件夹字段设置默认值,解析时即使没有子文件夹,也会尝试递归创建实例,最终触发递归深度限制。
- 将字段名改为复数形式
folders,既符合语义,也避免与类名Folder产生潜在混淆。
内容的提问来源于stack exchange,提问作者ary_anam
相关产品推荐
相关产品推荐

