对于逐字节相同的对象,assertEqual是否失败?

时间:2018-04-30 16:18:11

标签: python assert python-unittest

我有一个unittest,可以比较两个像这样的单元素词典:

{SomeClass(): SomeOtherClass()}

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

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

作为最后一次绝望的尝试,我尝试腌制这些dicts然后制作Unix差异,但这也没有表现出任何差别。叫我天真,但对我来说,这意味着这些对象是字节相同的字节,测试应该通过。这是怎么回事?

1 个答案:

答案 0 :(得分:1)

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

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

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

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

除了GC元数据之外,xy可能是逐字节相同的。 xy应该自动相等吗? x是唯一一个x属性指向自己的人;这似乎是一个很大的差异,他们不应该自动平等。

这只是在默认情况下尝试执行所需操作的问题之一。事实证明,最简单的默认是让==按身份运作;除非__eq__覆盖发挥作用,否则对象只会等同于自己。