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

如何用Python DeepDiff获取完整Delta?为何生成的Delta不完整?

问题:Delta为何未完整显示dict1的全部内容

我编写了如下测试代码(deeptest.py):

from deepdiff import DeepDiff, Delta

dict1 = {'catalog': {'uuid': 'e95fb23c-57d2-495f-8ab5-2c6b3152bcee', 'metadata': {'title': 'Catalog', 'last-modified': '2025-04-10T16:00:34.033789-05:00', 'version': '1.0', 'oscal-version': '1.1.2'}, 'controls': [{'id': 'ac-1', 'title': 'Access Control', 'parts': [{'id': 'ac-1_stmt', 'name': 'statement', 'prose': 'Access control text.'}]}]}}
dict2 = {}

diff = DeepDiff(dict1, dict2)

print(diff)

delta = Delta(diff)
        
print(f'delta {delta}')

控制台输出:

$ python python/deep_test.py 
{'dictionary_item_removed': ["root['catalog']"]}
delta <Delta: {"dictionary_item_removed":{"root['catalog']":{"uuid":""}}}

疑问:Delta应该包含dict1的全部内容,但实际并未完整显示,这是为什么?


原因与解决办法

这是DeepDiff默认对比逻辑导致的:

  • 当对比非空字典dict1和空字典dict2时,DeepDiff会将顶层键catalog的移除视为单一变化事件,仅记录被移除键的路径(root['catalog']),不会深入记录该键对应的完整嵌套值。
  • Delta基于Diff对象生成,只会保留Diff中记录的信息,因此无法显示catalog的完整内容。

要让Delta包含被移除项的完整内容,只需在生成DeepDiff时指定verbose_level=2参数,让Diff记录被移除项的具体值:

修改后的代码:

from deepdiff import DeepDiff, Delta

dict1 = {'catalog': {'uuid': 'e95fb23c-57d2-495f-8ab5-2c6b3152bcee', 'metadata': {'title': 'Catalog', 'last-modified': '2025-04-10T16:00:34.033789-05:00', 'version': '1.0', 'oscal-version': '1.1.2'}, 'controls': [{'id': 'ac-1', 'title': 'Access Control', 'parts': [{'id': 'ac-1_stmt', 'name': 'statement', 'prose': 'Access control text.'}]}]}}
dict2 = {}

# 添加verbose_level=2参数,记录被移除项的完整值
diff = DeepDiff(dict1, dict2, verbose_level=2)

print(diff)

delta = Delta(diff)
        
print(f'delta {delta}')

此时控制台输出的Delta会包含catalog的完整嵌套内容,因为Diff已经记录了被移除项的具体值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 09:22:04