DeepDiff 导入需用 from deepdiff import DeepDiff;ignore_order=True 仅对嵌套 list 有效,比较顶层 dict 列表需加 report_repetition=True;NaN、datetime、numpy 类型需特殊处理。
DeepDiff 安装后
报
常见现象是刚 pip install deepdiff 后直接写
,运行却提示
。这不是安装问题,而是导入方式记混了——
是类,不是函数,必须显式导入类本身。
正确写法:
(推荐)或
别写成
或
,后者会导入模块对象,不是类
注意大小写:
首字母大写,
包名全小写;写错大小写在 Linux/macOS 下直接报错
对比两个字典时
不生效
这是最常踩的坑:以为加了
就能无视 list 里元素顺序,结果仍报差异。根本原因是该参数默认只对「嵌套在 dict 中的 list」起作用,对顶层 list 或 list 中的 dict 无效。
场景举例:比较
和
→
有效
但比较
和
→ 默认不生效,需额外加
并配合
更稳妥的做法是明确指定
+
,尤其当 list 元素是 dict 时
性能影响:开启
会让 DeepDiff 内部做排列组合比对,大数据量 list 会明显变慢
pytest 中断言失败时输出太长,看不到关键差异
直接用
在 pytest 里失败时,只会打印一整段 diff 字符串,密密麻麻全是路径和值,根本没法快速定位哪一层错了。
Python 3.14.3
微软官方的 Python 扩展,是 VS Code 安装量最高的扩展(209M+)。集成 IntelliSense(通过 Pylance)、调试(通过 Python Debugger)、代码检查、格式化、重构和单元测试等功能。支持 Jupyter Notebook、虚拟环境管理和多 Python 版本切换。
下载
实操建议:用
限制输出粒度,避免嵌套过深的细节刷屏
更推荐封装成自定义断言函数,例如:
配合 pytest 的
参数 + 自定义 message,能精准看到
、
等分类项
注意:
会隐藏所有路径信息,调试时慎用
DeepDiff 对 NaN、datetime、numpy 类型处理出错
测试数据里一旦含
、
或 numpy 数组,
默认会抛
或返回意外结果,因为它内部用
做序列化预处理,而这三者都不被原生 JSON 支持。
立即学习
“
Python免费学习笔记(深入)
”;
NaN:Python 的
与 numpy 的
行为不同,前者在 DeepDiff 中可能被转成
,后者需注册自定义 type_comparator
datetime:必须传
或提前转成字符串(如
)
numpy:加
,否则数组会被展开成嵌套 list,diff 结果失真
兼容性提醒:DeepDiff 6.x 开始对 numpy 支持更好,但旧项目若用 5.x,建议统一转成 Python 原生类型再比
DeepDiff 看似简单,但真正跑通一次跨环境的测试数据校验,往往卡在类型兼容性和 order 处理逻辑上——尤其是当你的测试数据来自数据库 dump 和 API response 两条路径时,字段顺序、空值表示、时间精度这些细节,比算法本身更耗时间。
DeepDiffNameErrorfrom deepdiff import DeepDiffNameError: name 'DeepDiff' is not definedDeepDifffrom deepdiff import DeepDiffimport deepdiff; diff = deepdiff.DeepDiff(...)import DeepDifffrom deepdiff import deepdiffDeepDiffdeepdiffignore_order=Trueignore_order=True{"items": [1, 2]}{"items": [2, 1]}ignore_order=True[{"id": 1}, {"id": 2}][{"id": 2}, {"id": 1}]report_repetition=Trueignore_order=Trueignore_order=Truereport_repetition=Trueignore_orderassert not DeepDiff(...)DeepDiff(..., verbose_level=2)def assert_deep_equal(a, b):
diff = DeepDiff(a, b, ignore_order=True, report_repetition=True)
if diff:
raise AssertionError(f"Deep diff found:\n{diff}")-vvalues_changediterable_item_addedverbose_level=0float('nan')datetime.now()DeepDiffTypeErrorjson.dumpsfloat('nan')np.nanNoneignore_type_in_groups=(datetime.datetime,).isoformat()ignore_type_in_groups=(np.ndarray, np.number)