python - 对于逐字节相同的对象,assertEqual 失败?
问题描述
我有一个单元测试,可以比较两个像这样的 1 元素字典:
{SomeClass(): SomeOtherClass()}
dicts看起来与肉眼完全相似,键和值的类型也相同。尽管如此,测试还是失败了。
我当然尝试了各种技巧来在它们之间产生一些差异输出,但没有一个显示出这些对象或它的任何嵌套属性之间的任何区别。对象很大,所以 unittest diff 没有帮助。
作为最后一次绝望的尝试,我尝试腌制这些字典,然后制作 Unix 差异,但这也没有任何区别。称我为天真,但对我来说,这意味着这些对象是逐字节相同的,并且测试应该通过。这里发生了什么?
解决方案
相同的泡菜并不意味着逐字节相同的对象,并且逐字节相同的对象不一定相等。
您可能认为使逐字节相同的对象自动相等很容易,但这会遇到很多问题。例如,考虑以下情况:
class Foo(object):
__slots__ = ['x']
x = Foo()
y = Foo()
x.x = y.x = x
除了 GC 元数据,x
并且y
可能逐字节相同。应该x
和y
自动相等吗?x
是唯一一个x
属性指向自身的;这似乎是一个足够大的差异,它们不应该自动相等。
这只是默认情况下尝试做你想做的事情的问题之一。事实证明,最不容易混淆的默认设置是==
按身份工作。除非__eq__
覆盖起作用,否则对象将只等于它们自己。
推荐阅读
- memory - 如何在 Rust 的枚举中找到最大的变体?
- javascript - JavaScript 完全禁止滚动元素
- reactjs - 从 mdc 复选框中移除涟漪效应
- django - 如何检查Django中的重复名称
- javascript - Metronic Angular 8 Login Page 身份验证服务中的可观察错误如果我们在默认组件中使用相同的源代码它正在工作
- google-apps-script - 如何解决谷歌应用脚本超时问题
- wpf - 动画中的“(UIElement.Property)”和“Property”有什么区别
- javascript - 我可以在 i18next 的(异步)初始化之前使用 i18next-browser-languageDetector
- c++ - 如果类为空,则禁用所有类成员函数
- java - Java G1 GC:在 GC 之前/之后以编程方式查找巨大区域的数量