我有一个unittest,可以比较两个像这样的单元素词典:
{SomeClass(): SomeOtherClass()}
dicts看起来与肉眼完全相似,键和值的类型也相同。尽管如此,测试失败了。
我当然尝试了各种技巧来在它们之间产生一些差异输出,但是没有一个在这些对象或它的任何嵌套属性之间显示出任何差异。对象非常大,所以单元测试差异没有帮助。
作为最后一次绝望的尝试,我尝试腌制这些dicts然后制作Unix差异,但这也没有表现出任何差别。叫我天真,但对我来说,这意味着这些对象是字节相同的字节,测试应该通过。这是怎么回事?
答案 0 :(得分:1)
相同的pickle并不意味着逐字节相同的对象,并且逐字节的相同对象不一定相同。
您可能认为使逐字节相同的对象自动相等很容易,但这会遇到很多问题。例如,请考虑以下事项:
class Foo(object):
__slots__ = ['x']
x = Foo()
y = Foo()
x.x = y.x = Foo()
除了GC元数据之外,x
和y
可能是逐字节相同的。 x
和y
应该自动相等吗? x
是唯一一个x
属性指向自己的人;这似乎是一个很大的差异,他们不应该自动平等。
这只是在默认情况下尝试执行所需操作的问题之一。事实证明,最简单的默认是让==
按身份运作;除非__eq__
覆盖发挥作用,否则对象只会等同于自己。