基于多个BTrees的透明映射;适合旋转缓存和日志。
项目描述
BForest API
BForests 是类似于字典的对象,使用多个 BTrees 作为后端,并支持旋转复合树。这支持各种定时成员过期实现,从而实现缓存和半持久存储。一个有用的简单子类将是在键被访问时将键值对提升到第一个(最新)桶中,例如。它还与禁用旋转功能一起使用是有用的。
与 btrees 一样,bforests 有四种口味:整数-整数(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
现在我们将创建一个新的字典来表示桶旋转后的更改。
>>> 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)
我们将在一个桶中创建一个值,在另一个桶中将其覆盖。
>>> d[third.keys()[0]] = ValueGenerator() >>> d.rotateBucket() >>> d.update(third) >>> second.update(third) >>> d == second True >>> second == d True
树方法将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
最后,比较方式与字典类似,但比较方式比较简单——欢迎改进!我们已经在上面的很多例子中看到了很多,但这里还有一些额外的案例
>>> 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)
错误修正
添加了遗漏的 __ne__ 实现。
功能
添加了 minKey、maxKey,类似于 BTrees。
为它valuse、iteritems和iterkeys提供了与BTrees的values、items和keys相同的额外参数:min、max、excludemin、excludemax。
修改了 iter[…] 函数的实现,以尝试仅在需要时唤醒桶。
不兼容的更改
更改了 __eq__ 的定义:现在比较内容 和 顺序。尝试仅在需要时唤醒桶。
1.1.1 (2008-04-09)
错误修正
周期性变体伪保证最大周期,而不是最小周期,与文档相矛盾。已更改实现和测试以符合文档(即保证最小周期;最大周期在文档中有一定的模糊性)。
1.1 (2008-03-08)
功能
添加了周期性变体
添加了L变体
1.0 (?)
初始版本
项目详情
zope.bforest-1.2.tar.gz 的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | 611e1e0709c51c9c8af4cab86421d9b3eeec38de03d5473008a01e44e8f389e5 |
|
MD5 | 7fdefd275c861fcc09cc954309808c81 |
|
BLAKE2b-256 | 94d6c49c8f6a288020423d205f7d07a41853cb3446d71af22ad9cbc0d1ddc1eb |