跳转到主要内容

基于多个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 提供 itervaluesiterkeysiteritems,它们具有与 BTrees 的 valueskeysitems 相同的扩展参数。

>>> 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 (14.0 kB 查看散列)

上传时间

支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面