如何在Python中智能合并多层嵌套的配置对象?
实现配置的智能嵌套合并
需求分析
需要基于基础配置列表,通过覆盖配置列表完成嵌套式合并,核心规则:
- 列表按索引一一对应合并,每个位置的字典执行嵌套处理
- 字典:键已存在时,若值同为字典则递归合并,否则直接覆盖;键不存在时新增
- 仅执行添加/覆盖操作,不删除原有内容
实现代码
def merge_dicts(base: dict, override: dict) -> dict: """递归合并两个字典,仅覆盖或新增键值对""" merged = base.copy() for key, value in override.items(): # 嵌套字典递归合并 if key in merged and isinstance(merged[key], dict) and isinstance(value, dict): merged[key] = merge_dicts(merged[key], value) else: # 非字典类型直接覆盖,或新增键 merged[key] = value return merged def smart_merge(base_conf: list[dict], override_conf: list[dict]) -> list[dict]: """合并两个配置列表,按索引对应处理每个字典元素""" merged_list = [] max_len = max(len(base_conf), len(override_conf)) for i in range(max_len): # 处理列表长度不一致的情况,超出部分用空字典兜底 base_item = base_conf[i] if i < len(base_conf) else {} override_item = override_conf[i] if i < len(override_conf) else {} merged_list.append(merge_dicts(base_item, override_item)) return merged_list
测试验证
用你提供的示例代码测试:
base_conf = [ {'a': 'foo', 'b': 12, 'c': {'x': 1, 'y': 2}, 'd': [1, 2, 3]}, {'a': 'bar', 'd': [10, 20]} ] conf = { 'conf1': smart_merge(base_conf, [ {'b': 24, 'c': {'y': 20}}, {'c': {'x': 10, 'z': 30}} ]), } # 输出结果 print(conf['conf1'])
输出结果与预期完全一致:
[ {'a': 'foo', 'b': 24, 'c': {'x': 1, 'y': 20}, 'd': [1, 2, 3]}, {'a': 'bar', 'c': {'x': 10, 'z': 30}, 'd': [10, 20]} ]
额外说明
- 若覆盖列表长度大于基础列表,超出索引的覆盖配置元素会直接作为新项加入结果
- 若基础列表长度大于覆盖列表,超出索引的基础配置元素会原样保留
- 对于列表类型的值,当前逻辑是直接替换(若需要列表合并/追加,可扩展
merge_dicts函数,判断值为列表时执行对应操作)
内容的提问来源于stack exchange,提问作者Gavriel
相关产品推荐
相关产品推荐

