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

