基于多个btree的透明映射;适合于旋转缓存和日志。
zope.bforest的Python项目详细描述
bForest API
bForest是类似于字典的对象,它使用多个btree作为后端,并且 支持合成树的旋转。这支持各种实现 启用缓存和半永久性存储。一个 有用且简单的子类是将一个键值对提升为 第一个(最新的)bucket,例如,每当访问密钥时。它也是 用于禁用旋转功能。
和btrees一样,bforest有四种类型:integer integer(iibforest); 整数对象(iobforest)、对象整数(oibforest)和对象对象 (oobforest)。这里的例子将抽象地处理它们:我们将 从想象的和有代表性的bforest类创建类,并且 从KeyGenerator生成密钥,从ValueGenerator生成值。从 示例您应该能够推断所有四种类型的用法。
首先让我们实例化一个bforest并看一个空的例子。默认情况下, 新的bforest创建了两个复合btree桶。
>>> d = BForest() >>> list(d.keys()) [] >>> list(d.values()) [] >>> len(d.buckets) 2 >>> dummy_key = KeyGenerator() >>> d.get(dummy_key) >>> d.get(dummy_key, 42) 42
现在我们将填充它。我们将首先创建一个用于比较的btree。
>>> original = BForest._treemodule.BTree() >>> for i in range(10): ... original[KeyGenerator()] = ValueGenerator() ... >>> d.update(original) >>> d == original True >>> list(d) == list(original) True >>> list(d.keys()) == list(original.keys()) True >>> list(d.values()) == list(original.values()) True >>> list(d.items()) == list(original.items()) True >>> original_min = original.minKey() >>> d.popitem() == (original_min, original.pop(original_min)) True >>> original_min = original.minKey() >>> d.pop(original_min) == original.pop(original_min) True >>> len(d) == len(original) True
现在让我们旋转水桶。
>>> d.rotateBucket()
…首先,我们将进行与上述完全相同的测试。
>>> d == original True >>> list(d) == list(original) True >>> list(d.keys()) == list(original.keys()) True >>> list(d.values()) == list(original.values()) True >>> list(d.items()) == list(original.items()) True >>> original_min = original.minKey() >>> d.popitem() == (original_min, original.pop(original_min)) True >>> original_min = original.minKey() >>> d.pop(original_min) == original.pop(original_min) True >>> len(d) == len(original) True
现在我们将创建一个新字典来表示bucket之后所做的更改 旋转。
>>> second = BForest._treemodule.BTree() >>> for i in range(10): ... key = KeyGenerator() ... value = ValueGenerator() ... second[key] = value ... d[key] = value ... >>> original.update(second)
…首先,我们将进行与上述完全相同的测试。
>>> d == original True >>> list(d) == list(original) True >>> list(d.keys()) == list(original.keys()) True >>> list(d.values()) == list(original.values()) True >>> list(d.items()) == list(original.items()) True >>> original_min = original.minKey() >>> d.popitem() == (original_min, original.pop(original_min)) True >>> if original_min in second: ... _ = second.pop(original_min) >>> original_min = original.minKey() >>> d.pop(original_min) == original.pop(original_min) True >>> if original_min in second: ... _ = second.pop(original_min) >>> len(d) == len(original) True
bforest提供的itervalues、iterkeys和iteritems具有 与btrees'values、keys和items相同的扩展参数。
>>> list(d.itervalues()) == list(original.values()) True >>> list(d.iteritems()) == list(original.items()) True >>> list(d.iterkeys()) == list(original.keys()) True>>> keys = list(original) >>> mid = keys[len(keys)//2] >>> list(d.itervalues(min=mid)) == list(original.itervalues(min=mid)) True >>> list(d.itervalues(max=mid)) == list(original.itervalues(max=mid)) True >>> list(d.itervalues(min=mid, excludemin=True)) == list( ... original.itervalues(min=mid, excludemin=True)) True >>> list(d.itervalues(max=mid, excludemax=True)) == list( ... original.itervalues(max=mid, excludemax=True)) True>>> list(d.iterkeys(min=mid)) == list(original.iterkeys(min=mid)) True >>> list(d.iterkeys(max=mid)) == list(original.iterkeys(max=mid)) True >>> list(d.iterkeys(min=mid, excludemin=True)) == list( ... original.iterkeys(min=mid, excludemin=True)) True >>> list(d.iterkeys(max=mid, excludemax=True)) == list( ... original.iterkeys(max=mid, excludemax=True)) True>>> list(d.iteritems(min=mid)) == list(original.iteritems(min=mid)) True >>> list(d.iteritems(max=mid)) == list(original.iteritems(max=mid)) True >>> list(d.iteritems(min=mid, excludemin=True)) == list( ... original.iteritems(min=mid, excludemin=True)) True >>> list(d.iteritems(max=mid, excludemax=True)) == list( ... original.iteritems(max=mid, excludemax=True)) True
它还提供maxkey和minkey,比如btrees。
>>> d.maxKey() == original.maxKey() True >>> d.minKey() == original.minKey() True >>> d.maxKey(mid) == original.maxKey(mid) True >>> d.minKey(mid) == original.minKey(mid) True
现在,如果我们旋转桶,第一组项目将消失,但 第二个将继续。
>>> d.rotateBucket() >>> d == original False >>> d == second True
让我们设置一个值,检查复制行为,然后再旋转一次。
>>> third = BForest._treemodule.BTree({KeyGenerator(): ValueGenerator()}) >>> d.update(third) >>> copy = d.copy() >>> copy == d True >>> copy != second # because second doesn't have the values of third True >>> list(copy.buckets[0].items()) == list(d.buckets[0].items()) True >>> list(copy.buckets[1].items()) == list(d.buckets[1].items()) True >>> copy[KeyGenerator()] = ValueGenerator() >>> copy == d False >>> d.rotateBucket() >>> d == third True >>> d.clear() >>> d == BForest() == {} True>>> d.update(second)
我们将在一个bucket中生成一个值,并在另一个bucket中重写。
>>> d[third.keys()[0]] = ValueGenerator() >>> d.rotateBucket() >>> d.update(third) >>> second.update(third) >>> d == second True >>> second == d True
对于常见情况,tree方法有效地将bforest转换为btree 桶里的东西比桶里的多。
>>> tree = d.tree() >>> d_items = list(d.items()) >>> d_items.sort() >>> t_items = list(tree.items()) >>> t_items.sort() >>> t_items == d_items True
最后,比较的工作原理与dicts相似,但是 方式-欢迎改进!我们已经看过上面的很多例子, 但这里还有一些附加情况
>>> d == None False >>> d == [1, 2] False >>> d != None True >>> None == d False >>> d != None True >>> d >= second True >>> d >= dict(second) True >>> d <= second True >>> d <= dict(second) True >>> d > second False >>> d > dict(second) False >>> d < second False >>> d > dict(second) False >>> original_min = second.minKey() >>> del second[original_min] >>> original_min in d True >>> d > second True >>> d < second False >>> d >= second True >>> d <= second False >>> second < d True >>> second > d False >>> second <= d True >>> second >= d False
更改
1.2(2008-05-09)
错误修复:
- 添加了省略的实现。
功能:
- 增加了minkey,maxkey,比如btrees。
- 为itervalues、iteritems和iterkeys提供与btrees相同的额外参数 值、项和键:min、max、excludemin、excludemax。
- 将iter[…]函数的实现更改为仅尝试唤醒bucket 根据需要。
不兼容的更改:
- 更改了eq的定义:现在比较内容{em1}$和顺序。试图 只在需要的时候叫醒水桶。
1.1.1(2008-04-09)
错误修复:
- 周期变异是伪保证最大周期,而不是最小值。 期间,与文件相矛盾。将实现和测试更改为 匹配文件(即保证最小期限); 有点模糊,如文档中所述)。
1.1(2008-03-08)
功能:
- 添加了周期变量
- 添加了L-变体
1.0(?)
初始版本