基于多个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提供的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)

我们将在一个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(?)

初始版本

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
netbeans根据命名约定返回布尔类的getter的Java名称   java如何在MessageFormat中使用单引号   java如何在整数数组中只对奇数排序,而将偶数保留在其原始位置?   自定义ArrayAdapter中未定义java构造函数   java joda时间格式化程序解析yyyyymmdd(额外一小时)   java Spring引导控制器测试始终返回404   java如何提取类文件以获取该类文件中的类?   JTable java列不会显示   java Selenium Web驱动程序输出错误的Web表行数   当应用程序在mac上打开时,java SWT选项卡项会从页面上消失   java如何将html文件映射到过滤器   swing Java计算一段时间内两点之间的转换   javawebsphere和javax。xml。ws。spi。提供者:提供者组织。阿帕奇。axis2。jaxws。spi。提供者不是子类型   For循环在Java中没有按预期继续?   java如何配置gson以排除0个整数值   java读取一个由tab分隔的文件,并将单词放入ArrayList中   java我需要做什么才能让LiveConnect重新工作?   sqlservermerge2xml&使用java提取这些数据并将其存储在db表中   java如何在模型中添加新对象时通知网格