如何高效遍历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
相关产品推荐
相关产品推荐

