3

ZODB 提供 aPersistentList和 a PersistentMapping,但我想要一个PersistentSet. 我写了一个快速类,它反映了PersistentListZODB 2 中的古代。因为UserSet在 Python 中没有,我不得不从基于 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

该代码产生了“多个基地有实例布局冲突”错误。我尝试在 周围创建一个UserSet包装器set,但这也没有解决问题。

class UserSet(set):
    def __init__(self):
        self.value = set
    def __getattribute__(self, name):
        return self.value.__getattribute__(name

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

我有哪些选择? 我可能不得不从头开始实现一个集合,或者使用UserDict并丢弃所有的values.

4

3 回答 3

3

为什么不使用 ZODB 中的BTree库提供的持久集类。有 4 个这样的类可用。IITreeSet 和 IOTreeSet 管理整数集,而 OITreeSet 和 OOTreeSet 管理任意对象集。它们分别对应四个BTree类IIBTree、IOBTree、OIBTree和OOBTree。它们相对于 Python 中内置的集合实现的优势在于它们的快速查找机制(感谢底层 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])
于 2009-11-11T18:30:34.303 回答
1

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

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
于 2009-05-18T05:51:30.620 回答
1

对于未来的阅读,我只想对已经提出的答案稍作改进......

自定义持久集类

class PersistentSet(Persistent):

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

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

库中的持久集类

from BTrees.OOBTree import OOSet

也可以看看

于 2014-12-26T12:12:25.890 回答