在ZOBD中(在Python 3.x中),我希望能够将对象作为键存储在BTrees.OOBTree.OOBTree()中。我尝试时遇到的错误示例(请参阅注释):

from BTrees.OOBTree import OOBTree as Btree

class Test:
    pass

bt=Btree()
t=Test()
bt[t]=None #TypeError: Object has default comparison


因此,我读到某个地方可能需要定义__eq__来消除该错误,但是尽管这似乎可以解决先前的问题,但它似乎会引起更多的问题。例:

[编辑:应该注意的是,我在这里继承OOBTree(和TreeSet)时发现了一些问题。显然,它们没有正确保存。因此,即使它们继承了Persistent,也不同于继承Persistent。]

from BTrees.OOBTree import OOBTree as Btree

class Test:
    def __eq__(self, other): #Maybe this isn't the way to define the method
        return self==other

bt=Btree()
t=Test()
bt[t]=None

t in bt #TypeError: unorderable types: Test() < Test()


在BTree或OOBTree中将对象用作键的正确方法是什么?我确实需要测试密钥是否也存在。

对于那些不知道的人,ZODB中的BTrees非常像是为持久性而设计的可伸缩Python字典(与常规的Python词典相比,它们可与更多的键值对一起使用)。

最佳答案

我认为this answer可以帮助您解决问题。

基本上,您必须在对象上重新实现三个方法:


__eq__(相等性检查)
__ne__(非相等性检查)
__hash__使对象真正可序列化为字典键

关于python - 在ZOBD OOBTree中将对象用作键的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40992268/

10-09 03:04