首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ZODB 3中的PersistentSet

ZODB 3中的PersistentSet
EN

Stack Overflow用户
提问于 2009-05-17 22:07:09
回答 3查看 943关注 0票数 3

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

代码语言:javascript
复制
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包装器,但这也解决不了问题。

代码语言:javascript
复制
class UserSet(set):
    def __init__(self):
        self.value = set
    def __getattribute__(self, name):
        return self.value.__getattribute__(name

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-11-11 18:30:34

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

下面是一些示例代码:

代码语言:javascript
复制
>>> 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])
票数 3
EN

Stack Overflow用户

发布于 2009-05-18 05:51:30

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

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2014-12-26 12:12:25

对于将来的阅读,我只想提供一个比已经提出的答案稍微好一点.

自定义持久集类

代码语言:javascript
复制
class PersistentSet(Persistent):

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

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

来自库的持久set类

代码语言:javascript
复制
from BTrees.OOBTree import OOSet

另请参阅

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/875607

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档