gpt4 book ai didi

python - ZODB 3 中的持久集

转载 作者:太空宇宙 更新时间:2023-11-03 14:35:40 27 4
gpt4 key购买 nike

ZODB 提供了一个PersistentList 和一个PersistentMapping,但我想要一个PersistentSet。我写了一个反射(reflect)古代的快速类(class) PersistentList来自 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 包装器,但这也没有解决问题。

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

最后,我导入了 sets.Set(被内置的 set 取代),但这似乎也是用 C 语言实现的。我没有在 PyPI 上找到任何集合实现,所以我现在走投无路了。

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

最佳答案

为什么不使用 BTree 提供的持久集类? ZODB 中的库。有 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])

关于python - ZODB 3 中的持久集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/875607/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com