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

Python unittest递归式字典子集检查:assertDictContainsSubset替代方案问询

嵌套字典子集检查的现成解决方案

针对你提到的d1 | d2仅支持顶层字典合并、无法处理嵌套结构的问题,这里有几个现成的实用方案:

1. 用deepdiff库(推荐,支持复杂结构)

deepdiff是专门处理深层数据结构差异的工具,能精准判断嵌套字典的包含关系,还支持列表、元组等其他嵌套类型。

首先安装库:

pip install deepdiff

使用示例:

from deepdiff import DeepDiff

d1 = {
    'a': 1,
    'b': {
        'c': 2,
        'd': 3
    }
}

d2 = {
    'b': {
        'c': 2
    }
}

# 检查d2的所有键值是否都存在于d1中:若diff为空则说明包含
diff = DeepDiff(d2, d1, ignore_order=True)
assert not diff, f"d1不包含d2的全部内容,差异:{diff}"

ignore_order=True参数可以忽略列表、元组等有序结构的顺序差异,适合大多数测试场景。

2. 用assertpy库(断言友好,语法简洁)

assertpy提供了更人性化的断言方法,直接支持嵌套字典的子集检查,错误信息清晰易懂。

安装库:

pip install assertpy

使用示例:

from assertpy import assert_that

d1 = {
    'a': 1,
    'b': {
        'c': 2,
        'd': 3
    }
}

d2 = {
    'b': {
        'c': 2
    }
}

# 一行代码完成嵌套子集检查
assert_that(d1).contains_subset(d2)

3. 轻量版:自定义递归函数(无需第三方库)

如果不想安装额外库,也可以用一个简洁的递归函数处理字典嵌套场景(如需支持列表、元组可自行扩展):

def dict_contains_subset(subset, superset):
    # 非字典类型直接比较值
    if not isinstance(subset, dict) or not isinstance(superset, dict):
        return subset == superset
    # 遍历子集的每个键值对
    for key, val in subset.items():
        if key not in superset:
            return False
        # 递归检查嵌套结构
        if not dict_contains_subset(val, superset[key]):
            return False
    return True

# 使用示例
assert dict_contains_subset(d2, d1), "d1不包含d2的全部内容"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 01:35:01