首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >When PersistentDict,when文件夹?

When PersistentDict,when文件夹?
EN

Stack Overflow用户
提问于 2012-03-01 00:02:18
回答 2查看 935关注 0票数 4

什么时候应该使用PersistentDict,什么时候应该使用文件夹?它们在更新、内部结构、性能等方面有什么不同?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-01 04:36:04

PersistentMapping只是python dict类型的一个实现(通过标准库UserDict基类),对ZODB的持久性语义进行了调整;每次修改mapping时,它不必在最近的类上设置_p_changed标志,该类继承自Persistent

Folder是一种更丰富的类型,实现事件、与Zope web接口(ZMI)的集成、通过网络的任意属性(具有类型验证的属性)、Zope权限的管理、子项in的验证、导入/导出等。子项文件夹作为属性存储在对象本身上,一些元数据存储在实例上的私有字典中。

当您需要任何额外服务(权限委托、id验证等)时,请使用Folder,否则请使用PersistentMapping。在性能方面,查找或存储项目没有太大区别;一个是底层的直接python dict,另一个是存储项目的实例__dict__

如果您正在寻找冲突避免,您应该查看BTreesOOBTree类基本上是一个持久映射,其中的值存储在持久存储桶中,在大多数情况下避免冲突,并为其余部分提供冲突解决方案。

如果您想要具有BTree存储语义的Folder语义,可以看看Products.BTreeFolder2和附加组件,它实现了Folder接口,但是将子对象存储在OOBTree中,而不是直接作为实例上的属性。

票数 3
EN

Stack Overflow用户

发布于 2012-03-01 01:20:10

PersistentDict (现在称为PersistentMapping) )是从UserDict.IterableUserDict和persistent.Persistent继承的类。

Zope类是一个内置的模拟可迭代字典的python类,而persistent.Persistent是一个UserDict.IterableUserDict类,它允许将自身的一个实例保存在ZODB中。

因此,PersistentDict (或PersistentMapping)基本上就是一个可以作为对象存储在ZODB中的字典。

普通字典不能作为单独的对象存储在ZODB中。它们必须是某些继承自persistent.Persistent的类的属性。

PersistentDict将它的键和值存储在一个实际的字典( data属性)中。

PersistentDict不能通过zodb添加,我认为它主要用于特殊情况,即您想要将字典直接存储在zodb中。

对于文件夹,我猜你指的是zope.container.folder中的文件夹。文件夹将其子对象存储在OOBTree对象中,该对象是一个可以容纳大量对象的容器。

当您想要一个包含其他内容类型实例的容器时,您应该使用文件夹。

文件夹具有PersistentDict没有的接口,某些适配器或其他组件可能需要这些接口才能工作。例如,只有在修改文件夹时才会触发ContainerModified事件,而不会在修改PersistentDict时触发。如果你使用PersistentDict作为一个通用的文件夹,可能会有各种各样的问题。

当涉及到性能时,字典通常会更快,直到键空间变得非常大。然后,天平向OOBTree倾斜。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9502453

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档