ZODB提供了一个PersistentList
和PersistentMapping
,但我想要一个PersistentSet
。我写了一个快速课,反映了ZODB 2中的古代PersistentList
。由于Python中没有UserSet
,我不得不从基于C的内置set
扩展。PersistentSet in ZODB 3
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
s。
您的解决方案的工作原理看,但我做了一些改动。我在构造函数中添加了* args,并且在try块的末尾添加了self._p_changed = 1 ...我不确定这是否不必要,或者是否在响应中被意外省略。谢谢。 – 2009-05-18 21:23:12
@Nikhil,这是一个简单的捷径。您只会假设每个变量访问都会更改数据。如果你希望它是完美的,只需要包装每一个改变集合的方法。_p_changed = 1 – Unknown 2009-05-18 21:48:23