image

点击查看代码
def clean_node(nodes, full_name):
    names = full_name.split('.')
    current_name = names[0]

    for i, node in enumerate(nodes):
        assert isinstance(node, dict)
        if node.get('name') != current_name:
            continue
        # 如果是路径的最后一个节点,移除相应的节点
        if len(names) == 1:
            del nodes[i]
            break  # 不继续往下找了
        # 如果不是最后一个节点,深入子节点
        children = node.get('routes', [])
        if not children:
            break
        # 移除并检查是否也应该移除父字典
        has_nodes = clean_node(children, '.'.join(names[1:]))
        if not has_nodes:
            del nodes[i]

    return any(x.get('name') for x in nodes)
这段代码的功能是从一个路由树中删除指定路径的节点,操作过程可以简单理解为:
  1. 首先把要删除的完整路径(比如"datafilling.double-first-class")按点分割成多个部分(如["datafilling", "double-first-class"])

  2. 从路由树的顶层开始查找:

    • 先找和第一部分名称匹配的节点
    • 如果这是最后一个要查找的部分,直接删除这个节点
    • 如果不是最后一部分,就进入该节点的子路由(routes)继续查找下一部分
  3. 特殊处理:

    • 当删除子节点后,如果该节点没有其他子节点了,会连这个空节点一起删除
    • 整个过程是递归进行的,从顶层一直找到最深层的目标节点
  4. 最终返回一个结果,表示当前节点集合中是否还有剩余节点

简单说,就像在文件夹中删除一个深层文件,如果删除后父文件夹变空了,会连父文件夹一起删掉。