基于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)
1
0

copy方法创建dict的副本:

< Buff行情>
>>> d['foo'] = 'bar'
>>> len(d)
1
1

但是我们不支持比较,除了身份,因为 懦弱:

< Buff行情>
>>> d['foo'] = 'bar'
>>> len(d)
1
2

clear从dict中删除所有键:

< Buff行情>
>>> d['foo'] = 'bar'
>>> len(d)
1
3

其余的dict方法被委托给基础btree:

< Buff行情>
>>> d['foo'] = 'bar'
>>> len(d)
1
4

子类化

为了便于子类化,dict打算有三个重要的 特点:

  • 所有的添加都是用setitem完成的,因此覆盖它将控制 添加。
  • 所有的删除都是用 pop clear 来完成的,因此覆盖这些 方法将控制移除。
  • 在不传递参数的情况下调用init不会尝试访问 更新 方法。

让我们用一个快速的子类来演示这些。

< Buff行情>
>>> d['foo'] = 'bar'
>>> len(d)
1
5
>>> d['foo'] = 'bar'
>>> len(d)
1
6

回归测试

当设置已在dict中的项时,长度不是 增加:

< Buff行情>
>>> d['foo'] = 'bar'
>>> len(d)
1
7

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

推荐PyPI第三方库


热门话题
java在可序列化接口下重写readObject()和writeObject()方法在实际开发中的应用如何?   java JAXWS在显式添加SOAPAction头后发送空值   拆分从文件中读取的字符串时发生java ArrayIndexOutOfBoundsException   java使用Fabric远程启动Tomcat   这可以用Java实现吗?   java从AccoutHeaderBuilder()中定义的ProfileSettingDrawerItem()打开活动   java我需要我的SpringBootWebApplication在JUnit中重新启动   java通过蓝牙将数据从手机发送到笔记本电脑   java HttpServletRequest:如何确定所请求资产的ContentType   使用WMQ代码(非JMS)实现IBM MQ侦听器的java   使用java执行后台进程静默模式。exe   java如何从stringarray列表中随机选择   HackerAth上的java NZEC错误   java如何修复错误502状态   java JPanel GridLayout(部分由循环填充)将新值添加到end,而不考虑它们的添加顺序   java BigInteger循环和逻辑未按计划工作