对于逐字节相同的对象,assertEqual 会失败吗?

assertEqual fails for objects that are byte-for-byte identical?

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

{SomeClass(): SomeOtherClass()}

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

我当然尝试了各种技巧来在它们之间产生一些差异输出,但是 none 曾经显示出这些对象或其任何嵌套属性之间的任何差异。对象很大,所以单元测试差异没有帮助。

作为最后一次孤注一掷的尝试,我尝试对这些指令进行 pickle,然后制作一个 Unix diff,但这也没有显示出任何区别。说我天真吧,但对我来说,这意味着这些对象是逐字节相同的,测试应该通过。这是怎么回事?

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

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

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

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

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

这只是默认情况下尝试执行所需操作的问题之一。事实证明,最容易混淆的默认设置是 == 按身份工作;除非 __eq__ 覆盖发挥作用,否则对象将只等于它们自己。