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

如何高效遍历Python数据类依赖项并生成依赖名称字典

问题:高效遍历带依赖的Python数据类生成依赖字典

首先是定义的带依赖关系的Python数据类:

from dataclasses import dataclass

@dataclass
class BronzeA:
    name = "bronze_a"
    quality = "bronze"
    dependencies = None

@dataclass
class BronzeAA:
    name = "bronze_aa"
    quality = "bronze"
    dependencies = None

@dataclass
class SilverAA:
    name = "silver_aa"
    quality = "silver"
    dependencies = [BronzeAA]

@dataclass
class SilverA:
    name = "silver_a"
    quality = "silver"
    dependencies = [BronzeA, SilverAA]

@dataclass
class BronzeB:
    name = "bronze_b"
    quality = "bronze"
    dependencies = None

@dataclass
class SilverB:
    name = "silver_b"
    quality = "silver"
    dependencies = [BronzeB, SilverAA]

@dataclass
class Gold:
    name = "gold_data"
    quality = "gold"
    dependencies = [SilverA, SilverB]

需求是遍历这些数据类的依赖项,生成包含所有依赖类名称的字典。当前用多层嵌套循环实现,虽然能得到预期输出:

{'silver_a': 'SilverA',
 'bronze_a': 'BronzeA',
 'silver_aa': 'SilverAA',
 'bronze_aa': 'BronzeAA',
 'silver_b': 'SilverB',
 'bronze_b': 'BronzeB'}

但代码冗余,且依赖层级增加时需要手动新增嵌套循环,扩展性差。


解决方案

方法1:递归遍历

递归是最直观的方式,写一个函数处理单个类,添加映射后自动递归处理它的依赖:

def collect_dependencies(cls, result):
    # 添加当前类的名称映射
    result[cls.name] = cls.__name__
    # 如果不是bronze级且有依赖,递归处理每个依赖
    if cls.quality != 'bronze' and cls.dependencies is not None:
        for dep in cls.dependencies:
            collect_dependencies(dep, result)

# 调用示例
dependants = {}
collect_dependencies(Gold, dependants)
print(dependants)

方法2:迭代式广度优先遍历

如果担心递归深度过大导致栈溢出,可以用队列实现广度优先遍历,更安全:

from collections import deque

def collect_dependencies_iterative(start_cls):
    result = {}
    queue = deque(start_cls.dependencies)
    
    while queue:
        cls = queue.popleft()
        # 避免重复添加(如果存在循环依赖的情况)
        if cls.name not in result:
            result[cls.name] = cls.__name__
            if cls.quality != 'bronze' and cls.dependencies is not None:
                queue.extend(cls.dependencies)
    return result

# 调用示例
dependants = collect_dependencies_iterative(Gold)
print(dependants)

两种方法都能处理任意层级的依赖,不需要修改代码适配层级变化,而且比嵌套循环简洁得多。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 09:05:37