ZODB 3中的PersistentSet

2024-05-14 15:23:51 发布

您现在位置:Python中文网/ 问答频道 /正文

ZODB提供了一个PersistentList和一个PersistentMapping,但是我想要一个PersistentSet。我编写了一个快速类,它反映了ZODB 2中的古代^{}。因为Python中没有UserSet,所以我不得不从基于C的内置set进行扩展。在

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包装器,但这也没有解决问题。在

^{pr2}$

最后,我导入了sets.Set(被内置的set取代),但这似乎也在C中实现。我没有在PyPI上找到任何set实现,所以我现在处于死胡同中。在

我有什么选择?我可能不得不从头开始实现一个集合,或者使用UserDict并丢弃所有value


Tags: selfdefupdate内置zodbothersetchanged
3条回答

将所有属性请求转发到内部集合:

class PersistentSet(Persistent):
    def __init__(self):
        self.inner_set = set()

    def __getattribute__(self, name):
        try:
            inner_set = Persistent.__getattribute__(self, "inner_set")
            output = getattr(inner_set, name)
        except AttributeError:
            output = Persistent.__getattribute__(self, name)

        return output

对于以后的阅读,我只想提供一个稍微改进一下已经提出的答案。。。在

自定义持久集类

class PersistentSet(Persistent):

    def __init__(self, *args, **kwargs):
        self._set = set(*args, **kwargs)

    def __getattr__(self, name):
        return getattr(self._set, name)

库中的持久集类

^{pr2}$

另见

为什么不使用ZODB中的BTree库提供的persistent set类呢。有4个这样的班级。IITreeSet和IOTreeSet管理整数集,OITreeSet和OOTreeSet管理任意对象集。它们分别对应于四个BTree类:IIBTree、IOBTree、OIBTree和OOBTree。与Python内置的set实现相比,它们的优势在于它们的快速查找机制(到底层BTree的thanx)和持久性支持。在

下面是一些示例代码:

>>> 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])

相关问题 更多 >

    热门问题