gpt4 book ai didi

python - 如何使 DeepDiff 输出人类可读?

转载 作者:行者123 更新时间:2023-12-02 18:01:24 24 4
gpt4 key购买 nike

DeepDiff 结果如下:

{'dictionary_item_added': [root[5], root[6]], 'dictionary_item_removed': [root[4]]}

对于更改的人工审查,这仅适用于小示例。我需要类似 GitHub 提交和拉取请求中显示的代码文件差异之类的东西,但对于 json。

所以这是我的问题:

如何将 DeepDiff 输出转换为类似 human readable diff 的格式?

为什么我不想放弃 DeepDiff 而使用 git-diff

与代码不同,json 不关心格式,也不关心字典中键的顺序。

我可以通过预先对 json 中的所有字典进行排序然后将它们与 git-diff 进行比较来避免不使用 DeepDiff。然而,将文件写入磁盘并输出到 git-diff 是一件很麻烦的事情。只需执行 DeepDiff(t1, t2) 就非常干净。

我正在看的例子是:

from deepdiff import DeepDiff
t1 = {1:1, 3:3, 4:4}
t2 = {1:1, 3:3, 5:5, 6:6}
ddiff = DeepDiff(t1, t2)
print(ddiff)

我正在寻找的细节

我希望看到已更改的值中突出显示的词,如下所示:

diff with words highlighted有一些不同:

  • 这是一个代码示例,但它同样适用于 json
  • 我只需要它用于支持 ANSI 颜色的基于文本的终端
  • 我正在研究如何使用 Python 或 C++ 执行此操作
  • GitHub 截图有我喜欢的想法:用 -/+ 显示行并突出显示每行中的单词

最佳答案

difflib's ndiff可能是您要实现的目标:

import difflib
import json
from typing import Callable

t1 = {1:1, 3:3, 4:4}
t2 = {1:1, 3:3, 5:5, 6:6}

RED: Callable[[str], str] = lambda text: f"\u001b[31m{text}\033\u001b[0m"
GREEN: Callable[[str], str] = lambda text: f"\u001b[32m{text}\033\u001b[0m"

def get_edits_string(old: str, new: str) -> str:
result = ""

lines = difflib.ndiff(old.splitlines(keepends=True), new.splitlines(keepends=True))

for line in lines:
line = line.rstrip()
if line.startswith("+"):
result += GREEN(line) + "\n"
elif line.startswith("-"):
result += RED(line) + "\n"
elif line.startswith("?"):
continue
else:
result += line + "\n"

return result

print(
get_edits_string(
json.dumps(t1, indent=4, sort_keys=True),
json.dumps(t2, indent=4, sort_keys=True)
)
)

enter image description here

这样做的好处在 CLI 的情况下也很有帮助——我已经在代码中过滤了它,但它也有无颜色的差异,带有 ? 标记更改的位置.

关于python - 如何使 DeepDiff 输出人类可读?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74317707/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com