ZODB 3中的PersistentSet
作者:互联网
ZODB提供了一个PersistentList和PersistentMapping,但我想要一个PersistentSet.我编写了一个快速的类,该类反映了ZODB 2的古代PersistentList
.因为Python中没有UserSet,所以我不得不从基于C的内置集中扩展.
class PersistentSet(UserSet, Persistent):
def __iand__(self, other):
set.__iand__(other)
self._p_changed = 1
...
...
...
def symmetric_difference_update(self, other):
set.symmetric_difference_update(other)
self._p_changed = 1
该代码产生了“多个基例实例布局冲突”error.我尝试创建一个围绕Set的UserSet包装器,但这也没有解决问题.
class UserSet(set):
def __init__(self):
self.value = set
def __getattribute__(self, name):
return self.value.__getattribute__(name
最后,我导入了sets.Set(被内置set取代),但这似乎也用C实现.我在PyPI上没有找到任何固定的实现,所以我现在处于死胡同.
我有什么选择?我可能必须从头开始实现一个集合,或者使用UserDict并丢弃所有值.
解决方法:
为什么不使用ZODB中的BTree库提供的持久化设置类.有4种此类课程. IITreeSet和IOTreeSet管理整数集,而OITreeSet和OOTreeSet管理任意对象集.它们分别对应于四个BTree类IIBTree,IOBTree,OIBTree和OOBTree.与Python内置的set实现相比,它们的优势在于它们的快速查找机制(感谢底层BTree)和持久性支持.
这是一些示例代码:
>>> from BTrees.IIBTree import IITreeSet, union, intersection
>>> a = IITreeSet([1,2,3])
>>> a
<BTrees._IIBTree.IITreeSet object at 0x00B3FF18>
>>> b = IITreeSet([4,3,2])
>>> list(a)
[1, 2, 3]
>>> list(b)
[2, 3, 4]
>>> union(a,b)
IISet([1, 2, 3, 4])
>>> intersection(a,b)
IISet([2, 3])
标签:zodb,set,python 来源: https://codeday.me/bug/20191024/1921075.html