如何实现对__eq__列入集测试?(How to implement __eq__ for set

2019-08-17 11:06发布

我遇到了在那里我加入一个实例,以一组,然后后来的测试中看到该组中是否存在该对象的问题。 我已经覆盖__eq__()但它并不会纳入测试过程中调用。 我一定要重写__hash__()呢? 如果是的话,我将如何实现__hash__()因为我需要散列元组,列表和字典?

class DummyObj(object):

    def __init__(self, myTuple, myList, myDictionary=None):
        self.myTuple = myTuple
        self.myList = myList
        self.myDictionary = myDictionary

    def __eq__(self, other):
        return self.myTuple == other.myTuple and \
            self.myList == other.myList and \
            self.myDictionary == other.myDictionary

    def __ne__(self, other):
        return not self.__eq__(other)

if __name__ == '__main__':

    list1 = [1, 2, 3]
    t1    = (4, 5, 6)
    d1    = { 7 : True, 8 : True, 9 : True }
    p1 = DummyObj(t1, list1, d1)

    mySet = set()

    mySet.add(p1)

    if p1 in mySet:
        print "p1 in set"
    else:
        print "p1 not in set"

Answer 1:

从集上的文档 :

集合类是使用字典来实现。 因此,用于组元件的要求是相同的那些字典键; 即,该元件限定两个__eq __()和__hash __()。

所述__hash__函数文档表明异或部件的散列到一起。 正如其他人所说,这是一般不哈希可变对象是个好主意,但如果你真的需要,这个工程:

class DummyObj(object):

    ...

    def __hash__(self):
        return (hash(self.myTuple) ^
                hash(tuple(self.myList)) ^
                hash(tuple(self.myDictionary.items())))

并检查它是否成功:

p1 = DummyObj(t1, list1, d1)
p2 = DummyObj(t1, list1, d1)
mySet = set()
mySet.add(p1)

print "p1 in set", p1 in mySet
print "p2 in set", p2 in mySet

这将打印:

$ python settest.py 
p1 in set True
p2 in set True


Answer 2:

好了,我的猜测是__eq____ne__比较使用“中”经营者的物体时,可能没有被蟒蛇叫。 我还不能肯定具体的“富比较”操作符是什么,看文件,但覆盖__cmp__作为Python使用它在默认情况下执行的对象比较,如果更合适的“富比”经营者不执行应该解决您的问题。



文章来源: How to implement __eq__ for set inclusion test?