3

我想不通。我有两个相同的字典。我使用标准方法来确定差异,应该没有差异。但是某些值类型总是作为差异返回,即使它们不是。例如,如果值为 a pymongo.bson.ObjectId,则该方法无法将其评估为相同。

d1 = {'Name':'foo','ref1':ObjectId('502e232ca7919d27990001e4')}

d2 = {'Name':'foo','ref1':ObjectId('502e232ca7919d27990001e4')}

d1 == d2

返回:

True

但:

set((k,d1[k]) for k in set(d1) & set(d2) if d1[k] != d2[k])

返回:

set([('ref1',Objectid('502e232ca7919d27990001e4'))])

所以我发现这很奇怪,不是吗?

d1['ref1'] == d2['ref1']  # True

d1['ref1'] != d2['ref1']  # False

什么?????!?!??!!?

4

1 回答 1

2

ObjectId('502e232ca7919d27990001e4')创建一个新对象并默认!=比较引用。尝试例如:

class Obj:
    def __init__(self, value):
        self.value = value

print Obj(1234) == Obj(1234) # False

这将评估为假,因为它们是不同的实例,即使它们具有相同的值。为了使这项工作,该类必须实现eq方法:

class Obj:
    def __init__(self, value):
        self.value = value

    def __eq__(self, other):
        return self.value == other.value

print Obj(1234) == Obj(1234) # True

要解决此问题,您可以“猴子补丁”类:

class Obj:
    def __init__(self, value):
        self.value = value

print Obj(1234) == Obj(1234) # False

Obj.__eq__ = lambda a, b: a.value == b.value

print Obj(1234) == Obj(1234) # True

或者直接通过它们的值来比较它们。

print Obj(1234).value == Obj(1234).value

尽可能比较这些值,因为猴子补丁可能会破坏看似无关的代码。

于 2012-11-20T02:41:08.680 回答