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
相关产品推荐
相关产品推荐

