You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

关键修改说明

  1. 调整递归返回逻辑:把直接return parse(...)改成先存储递归结果,只有当结果不为None时才返回,否则继续循环当前层级的其他元素
  2. 统一返回出口:在函数末尾添加return None,确保只有遍历完所有可能的路径后,才会返回空值

这样修改后,当第一个topics分支没找到目标时,函数会继续检查当前列表里的下一个元素,直到找到包含sample3.html的topics分支,就能正确返回home/sample/sample3.html了。

内容的提问来源于stack exchange,提问作者marw

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:49:50