其他分享
首页 > 其他分享> > ZODB 3中的PersistentSet

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