在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/