任何python对象/数据的深度差异和搜索。

deepdiff的Python项目详细描述


4.0.7中的深度差异

<<<<<<<<<<<模仿模仿咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪咪72" />/P>
  • deepdiff:字典、iterables、字符串和其他对象的深度差异。它将递归地查找所有更改。
  • 深度搜索:在其他对象中搜索对象。
  • deephash:根据其内容散列任何对象。

在python 3.4、3.5、3.6、3.7、pypy3上测试

注意:不再支持Python2。DeepDiff v3.3.0是支持Python2的最后一个版本

安装

从pypi安装:

pip安装deepdiff

deepdiff更喜欢使用murdur3进行散列。但您必须通过运行以下命令手动安装Murdur3:

pip安装"deepdiff[杂音]"

否则deepdiff将使用sha256进行散列,这是一种加密散列,速度相当慢。

如果在安装Murdur3时遇到问题,请查看故障排除部分。

导入

啊!

深度差异

deepdiff获取两个对象的差异。

<阻塞率>

几个例子

<阻塞率>

注意:这只是deepdiff功能的一个简要概述。请访问https://deepdiff.readthedocs.io" rel="nofollow">https://deepdiff.readthedocs.io获取完整文档。

忽略顺序或重复项列出差异

啊!

报告重复次数

此标志仅在启用"忽略顺序"时有效。 请注意,此功能是实验性的。

啊!

它将打印您:

啊!

从比较中排除某些类型:

啊!

从比较中排除部分对象树

啊!

排除正则表达式路径

您还可以使用排除路径的regex排除使用正则表达式,并传递要排除的路径regex的集合或列表。列表中的项可以是原始regex字符串或编译的regex对象。

啊!

有效数字

小数点后的数字。在内部,它使用"{:.xf}"。格式(您的号码)来比较x=有效数字的数字

AAAAAAAAA 8

忽略类型号-包含浮点和整数的列表:

啊!

视图

启动W在deepdiff v 3中,您的不同数据有两种不同的视图:文本视图(原始)和树视图(新)。

文本视图

文本视图是deepdiff的原始和当前默认视图。

它被称为文本视图,因为结果包含表示数据路径的文本:

使用文本视图的示例。

>>>fromdeepdiffimportDeepDiff# For Deep Difference of 2 objects>>>fromdeepdiffimportgrep,DeepSearch# For finding if item exists in an object>>>fromdeepdiffimportDeepHash# For hashing objects based on their contents
0

因此,例如ddiff['dictionary\u item\u removed']是一个如果字符串的集合,因此称为文本视图。

>>>fromdeepdiffimportDeepDiff# For Deep Difference of 2 objects>>>fromdeepdiffimportgrep,DeepSearch# For finding if item exists in an object>>>fromdeepdiffimportDeepHash# For hashing objects based on their contents
1

树状视图

启动版本v3,您可以选择deepdiff结果中的视图。 树状图为您提供了可以遍历的树状对象,以查找不同对象的父对象和不同对象的实际对象。

项的值已更改(树状视图)

>>>fromdeepdiffimportDeepDiff# For Deep Difference of 2 objects>>>fromdeepdiffimportgrep,DeepSearch# For finding if item exists in an object>>>fromdeepdiffimportDeepHash# For hashing objects based on their contents
2

序列化

要将deepdiff对象转换为普通的python字典,请使用to_dict()方法。 请注意,即使您在树状图中执行了diff操作,to dict也将使用文本视图。

示例:

>>>fromdeepdiffimportDeepDiff# For Deep Difference of 2 objects>>>fromdeepdiffimportgrep,DeepSearch# For finding if item exists in an object>>>fromdeepdiffimportDeepHash# For hashing objects based on their contents
3

为了进行安全的json序列化,请使用to_json()方法。

示例:

>>>fromdeepdiffimportDeepDiff# For Deep Difference of 2 objects>>>fromdeepdiffimportgrep,DeepSearch# For finding if item exists in an object>>>fromdeepdiffimportDeepHash# For hashing objects based on their contents
4 < Buff行情>

深入搜索

deepdiff附带了一个实用程序,可以找到要查找的项目的路径。 它被称为deepsearch,它有一个类似于deepdiff的界面。

假设您有一个巨大的嵌套对象,并希望查看其中是否存在任何单词的项。 就像你在贝壳里一样,快速穿过你的物品!

>>>fromdeepdiffimportDeepDiff# For Deep Difference of 2 objects>>>fromdeepdiffimportgrep,DeepSearch# For finding if item exists in an object>>>fromdeepdiffimportDeepHash# For hashing objects based on their contents
5

将打印:

>>>fromdeepdiffimportDeepDiff# For Deep Difference of 2 objects>>>fromdeepdiffimportgrep,DeepSearch# For finding if item exists in an object>>>fromdeepdiffimportDeepHash# For hashing objects based on their contents
6

您也可以将与deepsearch相同的Kwargs传递给grep:

>>>fromdeepdiffimportDeepDiff# For Deep Difference of 2 objects>>>fromdeepdiffimportgrep,DeepSearch# For finding if item exists in an object>>>fromdeepdiffimportDeepHash# For hashing objects based on their contents
7 < Buff行情>

深度哈希

(v4-0-0中的新功能)

deephash的设计目的是根据任何python对象的内容对其进行散列,即使该对象被认为是不可散列的! deephash应该是确定性的,以便确保包含相同数据的两个对象产生相同的hash。

< Buff行情>

假设您有一个dictionary对象。

>>>fromdeepdiffimportDeepDiff# For Deep Difference of 2 objects>>>fromdeepdiffimportgrep,DeepSearch# For finding if item exists in an object>>>fromdeepdiffimportDeepHash# For hashing objects based on their contents
8

如果您尝试散列它:

>>>fromdeepdiffimportDeepDiff# For Deep Difference of 2 objects>>>fromdeepdiffimportgrep,DeepSearch# For finding if item exists in an object>>>fromdeepdiffimportDeepHash# For hashing objects based on their contents
9

但使用deephash时:

>>>t1={1:1,2:2,3:3,4:{"a":"hello","b":[1,2,3]}}>>>t2={1:1,2:2,3:3,4:{"a":"hello","b":[1,3,2,3]}}>>>ddiff=DeepDiff(t1,t2,ignore_order=True)>>>print(ddiff){}
0

那么,在这种情况下,obj的哈希值到底是多少呢? deephash正在计算obj和obj包含的任何其他对象的哈希。 deephash的输出是对象id到其散列的字典。 为了得到obj本身的散列,需要使用对象(或对象的id)来得到它的散列:

>>>t1={1:1,2:2,3:3,4:{"a":"hello","b":[1,2,3]}}>>>t2={1:1,2:2,3:3,4:{"a":"hello","b":[1,3,2,3]}}>>>ddiff=DeepDiff(t1,t2,ignore_order=True)>>>print(ddiff){}
1

可以写成:

>>>t1={1:1,2:2,3:3,4:{"a":"hello","b":[1,2,3]}}>>>t2={1:1,2:2,3:3,4:{"a":"hello","b":[1,3,2,3]}}>>>ddiff=DeepDiff(t1,t2,ignore_order=True)>>>print(ddiff){}
2

起初,为什么deephash(obj)[obj]看起来很奇怪,但请记住,deephash(obj)是obj包含的所有其他对象的散列字典。

< Buff行情>

在单元测试中使用deepdiff

result是正在测试的函数的输出。 预期的是函数的预期输出。

>>>t1={1:1,2:2,3:3,4:{"a":"hello","b":[1,2,3]}}>>>t2={1:1,2:2,3:3,4:{"a":"hello","b":[1,3,2,3]}}>>>ddiff=DeepDiff(t1,t2,ignore_order=True)>>>print(ddiff){}
3

或者如果您正在使用pytest:

>>>t1={1:1,2:2,3:3,4:{"a":"hello","b":[1,2,3]}}>>>t2={1:1,2:2,3:3,4:{"a":"hello","b":[1,3,2,3]}}>>>ddiff=DeepDiff(t1,t2,ignore_order=True)>>>print(ddiff){}
4

换句话说,断言没有差异在预期和结果之间。

与json补丁的区别

与仅为json对象设计的json补丁不同,deepdiff是专门为几乎所有python类型设计的。除此之外,deepdiff还检查json修补程序没有涵盖的类型更改和属性值更改,因为json中没有此类内容。最后,deepdiff给出了在python语法中更改的项的确切路径。

json补丁中用于替换的示例:

{"op":"replace","path":"/a/b/c","value":42}

deepdiff中相同操作的示例:

>>>t1={1:1,2:2,3:3,4:{"a":"hello","b":[1,2,3]}}>>>t2={1:1,2:2,3:3,4:{"a":"hello","b":[1,3,2,3]}}>>>ddiff=DeepDiff(t1,t2,ignore_order=True)>>>print(ddiff){}
5

PYCON 2016年

我很荣幸地向大家介绍了DeepDiff在2016年Pycon大会上的表现。请查看视频并告诉我您的想法:

对其进行区分以挖掘视频 这里有更多信息:http://zepworks.com/blog/diff-it-to-digg-it/

文档

http://deepdiff.readthedocs.io/en/latest/

故障排除

杂音3

在安装deepdiff时无法生成mmh3

deepdiff更喜欢使用murdur3进行散列。但是,您必须通过运行:pip install mmh3手动安装murdur3

在MacOS Mojave上,安装Murdur3时会遇到一些用户体验困难。

可以通过运行以下命令解决此问题:

xcode选择--安装

然后运行

pip安装mmh3

更改日志

  • v4-0-7:数字1与真值的哈希运算
  • v4-0-6:在python中发现了一个用科学符号格式化数字的小错误。添加了解决方法。
  • V4-0-5:固定数字差异。将数字格式符号和数字添加到字符串函数。
  • v4-0-4:添加ignore_string_case和ignore_type_子类
  • v4-0-3:添加版本凹凸工具以进行发布
  • V4-0-2:修复缺少RST文件的安装问题。
  • v4-0-1:修复安装tarball missing requirements.txt。DeepDiff v4+不应显示为可用于Py2安装的PIP。使Murdur3安装成为可选。
  • v4-0-0:结束python 2支持,为deephash添加更多功能和文档。切换到pytest进行测试。切换到杂音3 128位进行哈希运算。修复从具有时隙的类继承的类时,并没有比较它们的所有时隙。将contenthash重命名为deephash。将exclude by path和regex path添加到deephash。在组中添加ignore_type_。正在向deepsearch添加匹配字符串。添加TimeDelta对象扩散。
  • v3-5-0:排除regex路径
  • v3-3-0:搜索对象和类属性
  • v3-2-2:添加帮助(deepdiff)
  • v3-2-1:修复none的散列
  • v3-2-0:为搜索添加grep:object grep(item)
  • v3-1-3:Unicode与字节的默认修复方法
  • v3-1-2:添加或删除项目时不存在修复。
  • v3-1-1:当项目值为none时修复错误(58)
  • v3-1-0:序列化到/从json
  • v3-0-0:引入树状视图
  • v2-5-3:内容哈希的日志错误修复。
  • v2-5-2:内容哈希上的错误修复。
  • v2-5-0:添加contenthash模块以一次性修复忽略顺序。
  • v2-1-0:添加深度搜索。现在您可以在对象中搜索项目。
  • v2-0-0:排除模式更好的覆盖范围。更新文档。
  • v1-8-0:排除模式。
  • v1-7-0:深集比较。
  • v1-6-0:统一密钥名称。即new value现在是newvalue。为了向后兼容,newvalue仍然有效。
  • v1-5-0:修复带有无序项的忽略订单容器。比较小数时添加有效数字。不推荐使用Changes属性。
  • v1-1-0:频道将更改集、字典和对象属性添加/删除报告为集而不是列表。添加pypy兼容性。
  • v1-0-2:检查ImmutableMapping类型而不是dict
  • v1-0-1:最好忽略订单支持
  • v1-0-0:重组输出以使其更有用。这不是向后兼容的。
  • v0-6-1:在忽略订单时修复不可更改的项目
  • v0-6-0:添加Unicode支持
  • v0-5-9:添加十进制支持
  • v0-5-8:添加不可更改支持的忽略顺序
  • v0-5-7:添加忽略订单支持
  • v0-5-6:添加插槽支持
  • V0-5-5:增加回路检测

发布

我们使用bump2version对版本进行凹凸和标记。

>>>t1={1:1,2:2,3:3,4:{"a":"hello","b":[1,2,3]}}>>>t2={1:1,2:2,3:3,4:{"a":"hello","b":[1,3,2,3]}}>>>ddiff=DeepDiff(t1,t2,ignore_order=True)>>>print(ddiff){}
6

贡献

  1. 请对开发部门进行公关
  2. 请确保你的公关有测试。由于deepdiff在许多敏感的数据驱动项目中使用,我们对代码保持100%的测试覆盖率。这条规则偶尔也有例外,但这种情况很少见。

谢谢你!

作者

  • 塞伯曼(SEP DEHPOUR)

  • Victor Hahn Castell的主要贡献

  • 用于Travis CI设置脚本的NFV。

  • brbsix用于初始py3移植。

  • Wangfenjin支持Unicode。

  • timoilya用于在忽略顺序时比较集合列表。

  • 用于有效数字比较的Bernhard10。

  • b-jazz用于pep257清理,标准化全名,固定行结尾。

  • 用于固定插槽的Finnhuges

  • moloney for unicode vs.bytes默认值

  • 用于添加帮助的serv inc(deepdiff)

  • 用于更新文档的movermeyer

  • 用于在继承的类属性中搜索的maxrothman

  • 用于搜索类型/对象的MaxRothman

  • 用于排除regex路径的martyhub

  • sreecodeslayer for deepsearch匹配字符串

  • brian maissy(brianmaissy)用于weakref修复,枚举测试

  • 用于排除类型的bartosz borowik(boba-2)在忽略顺序时修复

  • brian maissy(brianmaissy)用于修复从具有时隙的类继承的类,但没有比较它们的所有时隙

  • juan soler(soleronline)用于添加忽略类型号

  • mthaddon用于添加timedelta diffing支持

  • 数字1与真的散列的尸检

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java限制C++代码访问JNI中的某些类   Android上的java DateFormat:不可解析的日期   通过json进行java迭代,并为其他请求调用多个API   Netbeans中的java JavaFX项目引发异常“输入流不能为null”   多线程Java newFixedThreadPool解释   |在java字符串中无法识别。split()方法   Java中的原始包装器类是否被视为引用类型?   Java swing。如何在intellij idea GUI设计工具中重写组件方法   数组乘矩阵   java将30GB的XML文件分割成小块XML   java通过一棵树递归找到一个节点,并返回指向该节点的路径   java如何将可观察的<Observable<List<T>>转换为可观察的<List<T>>   使用java在web服务器上更改php文件中的字符串?   java希望开发像tomcat这样的servlet容器   java希望提高编程的数学技能