首页 > 解决方案 > 对于逐字节相同的对象,assertEqual 失败?

问题描述

我有一个单元测试,可以比较两个像这样的 1 元素字典:

{SomeClass(): SomeOtherClass()}

dicts看起来与肉眼完全相似,键和值的类型也相同。尽管如此,测试还是失败了。

我当然尝试了各种技巧来在它们之间产生一些差异输出,但没有一个显示出这些对象或它的任何嵌套属性之间的任何区别。对象很大,所以 unittest diff 没有帮助。

作为最后一次绝望的尝试,我尝试腌制这些字典,然后制作 Unix 差异,但这也没有任何区别。称我为天真,但对我来说,这意味着这些对象是逐字节相同的,并且测试应该通过。这里发生了什么?

标签: pythonassertpython-unittest

解决方案


相同的泡菜并不意味着逐字节相同的对象,并且逐字节相同的对象不一定相等。

您可能认为使逐字节相同的对象自动相等很容易,但这会遇到很多问题。例如,考虑以下情况:

class Foo(object):
    __slots__ = ['x']

x = Foo()
y = Foo()
x.x = y.x = x

除了 GC 元数据,x并且y可能逐字节相同。应该xy自动相等吗?x是唯一一个x属性指向自身的;这似乎是一个足够大的差异,它们不应该自动相等。

这只是默认情况下尝试做你想做的事情的问题之一。事实证明,最不容易混淆的默认设置是==按身份工作。除非__eq__覆盖起作用,否则对象将只等于它们自己。


推荐阅读