基于BTAR的持久类DICT对象(常规的DICT和ORDER),可以用作基类。这是一个有点沉重的解决方案,因为每个zc.dict.dict(和zc.dict.ordereddict)至少是3个持久对象。如果你想创造很多这样的东西,请记住这一点。若要生成,请从该目录运行“python bootstrap/bootstrap.py”,然后运行“bin/buildout”。强烈建议使用干净的非系统python。
zc.dict的Python项目详细描述
一个有效的、持久的和可子类的dict
如果persistendict包含多个 的值,不建议从继承树。
这个类是btree上的一个简单包装器。它保留了 btrees的效率,可以安全地用作基类。而且,它 实现完整的python dict接口。
< Buff行情>>>> from zc.dict import Dict >>> d = Dict() >>> d <zc.dict.dict.Dict object at ...>
>>> d['foo'] = 'bar' >>> len(d) 1
>>> d['bar'] = 'baz' >>> len(d) 2
注意,python dict和这个dict的一个重要区别是 python dict使用散列,这使用btree比较。 实际上,这意味着您的密钥应该是同质类型的。 我们在这些例子中使用字符串。
长度是单独维护的,因为btree上的len是低效的, 因为它必须从数据库中唤醒树中的所有存储桶。
< Buff行情>>>> d._len <BTrees.Length.Length object at ...> >>> d._len() 2
为了使更新对小的更改保持高效,我们展开它们 作为一系列设置项。
< Buff行情>>>> d.update({'bar': 'moo', 'ding': 'dong', 'beep': 'beep'}) >>> len(d) 4
dict支持完整的更新界面。
< Buff行情>>>> d.update([['sha', 'zam'], ['ka', 'pow']]) >>> len(d) 6 >>> d['ka'] 'pow' >>> d.update(left='hook', right='jab') >>> len(d) 8 >>> d['left'] 'hook'
弹出窗口需要更新长度。
< Buff行情>>>> d.pop('sha') 'zam' >>> d.pop('ka') 'pow' >>> d.pop('left') 'hook' >>> d.pop('right') 'jab' >>> len(d) 4
…除非没有。
< Buff行情>>>> d.pop('nonexistent') Traceback (most recent call last): ... KeyError: 'nonexistent' >>> d.pop('nonexistent', 42) 42 >>> len(d) 4
设置默认值 有时还需要更新长度。
< Buff行情>>>> len(d) 4 >>> d.setdefault('newly created', 'value') 'value' >>> d['newly created'] 'value' >>> len(d) 5
>>> from zc.dict import Dict >>> d = Dict() >>> d <zc.dict.dict.Dict object at ...>0
>>> from zc.dict import Dict >>> d = Dict() >>> d <zc.dict.dict.Dict object at ...>1
键 , 值 和 项 返回正常的python列表。因为 基本的btree,它们总是按键的顺序排列。
< Buff行情>>>> from zc.dict import Dict >>> d = Dict() >>> d <zc.dict.dict.Dict object at ...>2
>>> from zc.dict import Dict >>> d = Dict() >>> d <zc.dict.dict.Dict object at ...>3
>>> from zc.dict import Dict >>> d = Dict() >>> d <zc.dict.dict.Dict object at ...>4
但是,有效的btree迭代器可以通过iter方法获得:
< Buff行情>>>> from zc.dict import Dict >>> d = Dict() >>> d <zc.dict.dict.Dict object at ...>5
>>> from zc.dict import Dict >>> d = Dict() >>> d <zc.dict.dict.Dict object at ...>6
>>> from zc.dict import Dict >>> d = Dict() >>> d <zc.dict.dict.Dict object at ...>7
popitem从dict中删除并返回一个键值对:
< Buff行情>>>> from zc.dict import Dict >>> d = Dict() >>> d <zc.dict.dict.Dict object at ...>8
>>> from zc.dict import Dict >>> d = Dict() >>> d <zc.dict.dict.Dict object at ...>9
>>> d['foo'] = 'bar' >>> len(d) 10
copy方法创建dict的副本:
< Buff行情>>>> d['foo'] = 'bar' >>> len(d) 11
但是我们不支持比较,除了身份,因为 懦弱:
< Buff行情>>>> d['foo'] = 'bar' >>> len(d) 12
clear从dict中删除所有键:
< Buff行情>>>> d['foo'] = 'bar' >>> len(d) 13
其余的dict方法被委托给基础btree:
< Buff行情>>>> d['foo'] = 'bar' >>> len(d) 14
子类化
为了便于子类化,dict打算有三个重要的 特点:
- 所有的添加都是用setitem完成的,因此覆盖它将控制 添加。
- 所有的删除都是用 pop 或 clear 来完成的,因此覆盖这些 方法将控制移除。
- 在不传递参数的情况下调用init不会尝试访问 更新 方法。
让我们用一个快速的子类来演示这些。
< Buff行情>>>> d['foo'] = 'bar' >>> len(d) 15
>>> d['foo'] = 'bar' >>> len(d) 16
回归测试
当设置已在dict中的项时,长度不是 增加:
< Buff行情>>>> d['foo'] = 'bar' >>> len(d) 17