YAML解析递归函数异常:部分路径返回None问题求助
问题分析与修复
你的问题出在递归调用的返回逻辑上——当函数遇到topics字段时,直接返回了递归调用的结果,但如果这个递归分支没找到目标路径,函数就会直接返回None,完全跳过了当前列表中后续元素的遍历。
举个具体的例子:在你的示例YAML里,sample3.html所在的topics是当前层级的第5个元素,但前面第3个元素的topics递归后返回None(因为里面没有sample3.html),你的函数会直接把这个None返回,根本不会去检查后面的第5个元素。
修复后的代码
from ruamel.yaml import YAML as yaml content = yaml().load(open(r'/home/doc/sample.yaml', 'r')) def parse(content, path): """ Parse the YAML. """ for i in content: if isinstance(i, dict): for item in i: if item == 'href': if i[item] in path: return i[item] elif item == 'topics': # 先接收递归结果,找到目标再返回,没找到就继续遍历当前层级的其他元素 result = parse(i[item], path) if result is not None: return result elif item == 'placeholder': pass else: print("I did not recognize", item) else: print("---- not a dictionary ----") # 遍历完所有元素都没找到目标,才返回None return None
关键修改说明
- 调整递归返回逻辑:把直接
return parse(...)改成先存储递归结果,只有当结果不为None时才返回,否则继续循环当前层级的其他元素 - 统一返回出口:在函数末尾添加
return None,确保只有遍历完所有可能的路径后,才会返回空值
这样修改后,当第一个topics分支没找到目标时,函数会继续检查当前列表里的下一个元素,直到找到包含sample3.html的topics分支,就能正确返回home/sample/sample3.html了。
内容的提问来源于stack exchange,提问作者marw
相关产品推荐
相关产品推荐

