zope.keyreference提供了支持稳定的比较和散列对象引用。
持久性对象的主要参考文献
zope.keyreference.persistent.KeyReferenceToPersistent提供了持久对象的zope.keyreference.interfaces.IKeyReference参考。
让我们来看一个例子。首先,我们将创建一个数据库中的一些持久性对象:
 从>>>进口ZODB.MappingStorage DB
  >>>进口交易
 从>>>进口persistent.mapping PersistentMapping
  >>> DB = DB()
  >>>康恩= db.open()
  >>>根= conn.root()
  >>>根['OB1'] = PersistentMapping()
  >>>根['OB2'] = PersistentMapping()
  >>>器transaction.commit()
然后,我们将创建一些关键的参考:
 从>>>进口zope.keyreference.persistent KeyReferenceToPersistent
  >>>键1 = KeyReferenceToPersistent(根['OB1'])
  >>>键2 = KeyReferenceToPersistent(根['OB2'])
我们可以调用键得到对象:
  >>> KEY1()是根['OB1'],键2()是根['OB2']
 (真,真)
新的密钥为相同的对象是等于旧:
  >>> KeyReferenceToPersistent(根['OB1'])== KEY1
 真
并具有相同的哈希值:
  >>>哈希(KeyReferenceToPersistent(根['OB1']))==哈希(键1)
 真
其他主要的参考实现由它们的密钥类型ID不同。主要参考文献应先对自己的密钥类型和第二类的任何类型的具体信息:
 从>>>进口zope.interface工具
 从>>>进口zope.keyreference.interfaces IKeyReference
  >>>类DummyKeyReference(对象):
  ...工具(IKeyReference)
  ... key_type_id ='zope.app.keyreference.object“
  ...高清__init __(个体经营,OBJ):
  ... self.object的obj =
  ...高清__cmp __(自我,其他的):
  ......如果self.key_type_id == other.key_type_id:
  ...回报CMP(self.object,other.object)
  ...回报CMP(self.key_type_id,other.key_type_id)
  >>> dummy_key1 = DummyKeyReference(对象())
  >>> dummy_key2 = DummyKeyReference(对象())
  >>> dummy_key3 = DummyKeyReference(对象())
  >>>键= [键1,dummy_key1,dummy_key2,KEY2,dummy_key3]
  >>> keys.sort()
  >>> key_type_ids = [key.key_type_id在按键键]
  >>> key_type_ids [0:3] .Count之间('zope.app.keyreference.object')
  3
  >>> key_type_ids [3:]计数('zope.app.keyreference.persistent“)
  2
我们将存储在数据库中的关键参考:
  >>>根['键1'] = key1的
  >>>根['KEY2'] = KEY2
并使用键来重新存储的对象:
  >>>根[键1] =根['OB1']
  >>>根[键2] =根['OB2']
  >>>器transaction.commit()
现在,我们将打开另一个连接:
  >>> CONN2 = db.open()
并验证我们可以使用按键来查找对象:
  >>> root2 = conn2.root()
  >>>键1 = root2 ['键1']
  >>> root2 [键1]是root2 ['OB1']
 真
  >>>键2 = root2 ['键2']
  >>> root2 [键2]是root2 ['OB2']
 真
而且我们也可以拨打键得到对象:
  >>> KEY1()是root2 ['OB1']
 真
  >>> KEY2()是root2 ['OB2']
 真
我们不能为已尚未保存的对象的关键参考:
  >>> KeyReferenceToPersistent(PersistentMapping())
  ...#文档测试:+省略号
 回溯(最近通话最后一个):
  ...
  NotYet:...
需要注意的是,我们得到一个NotYet错误。这表明,我们也许能够以后得到一个重要的参考。
我们可以得到引用未保存的对象,如果他们有一个适配器ZODB.interfaces.IConnection。连接上的加载方法将被用于给对象的对象ID,它是足够的信息来计算参考。看到这一点,我们将创建一个对象,符合IConnection在一个愚蠢的方法:
  >>>进口持续
 从>>>进口ZODB.interfaces IConnection
  >>> C类(persistent.Persistent):
  ...高清__conform __(个体经营,iface的):
  ......如果IFACE是IConnection:
  ...回报CONN2
  >>> OB3 = C()
  >>> KEY3 = KeyReferenceToPersistent(OB3)
  >>> transaction.abort()
冲突解决
在解决冲突,在ZODB / ConflictResolution.txt讨论,引用持久对象实际上是ZODB.ConflictResolution.PersistentReference的实例。这是相关的以两种方式进行KeyReferenceToPersistent。首先,它说明了类的精妙之处:它不会从persistent.Persistent继承。如果有,它不会解决冲突,只是它PersistentReference替身。
其次,它解释了一些在__hash__和__cmp__方法的代码。这些方法不仅可以处理persistent.Persistent对象,但PersistentReference对象。如果没有这种问题,对象,如经典ZODB B树,使用KeyReferenceToPersistent作为键或组成员将无法解决冲突。即使使用特殊代码,在某些情况下,KeyReferenceToPersistent将拒绝冲突解决过程中进行比较和散列,因为它不能可靠地这样做。
__hash__将工作相对很少的冲突解决过程:只对多数据库引用。下面是几个例子。
 从>>>进口ZODB.ConflictResolution PersistentReference
  >>>高清厂(参考):
  ...解析度= KeyReferenceToPersistent .__新__(
  ... KeyReferenceToPersistent,参考)
  ... res.object = REF
  ...回报水库
  ...
  >>>哈希(工厂(PersistentReference(
  ......('的OID“,”一流的元数据'))))#典型的参考
 回溯(最近通话最后一个):
  ...
  ValueError错误:此时数据库名称不可用
  >>>布尔(哈希(工厂(PersistentReference(
  ... ['M'('数据库','一个OID“,”一流的元数据')))))#多数据库
 真
这意味着,KeyReferenceToPersistent往往会阻碍冲突解决的类,如PersistentMapping。
__cmp__工作,除非一个物体是一个多数据库的参考,另一种是没有。下面是一些例子。
  >>> CMP(厂(PersistentReference(
  ......('的OID“,”一流的元数据')))
  ...厂(PersistentReference(
  ......('的OID“,”一流的元数据'))))
  0
  >>> CMP(厂(PersistentReference(
  ......('的OID“,”一流的元数据')))
  ...厂(PersistentReference(
  ......(“另一个OID”,“一流的元数据'))))
  -1
  >>> CMP(厂(PersistentReference('的OID')),
  ...厂(PersistentReference(
  ......('的OID“,”一流的元数据'))))
  0
  >>> CMP(厂(PersistentReference('的OID')),
  ...厂(PersistentReference(
  ......('的OID“,”一流的元数据'))))
  0
  >>> CMP(厂(PersistentReference(
  ... ['M'('数据库','一个OID“,”一流的元数据')))
  ...厂(PersistentReference(
  ... ['M'('数据库','一个OID“,”一流的元数据'))))
  0
  >>> CMP(厂(PersistentReference(
  ... ['M'('数据库','一个OID“,”一流的元数据')))
  ...厂(PersistentReference(
  ... ['N'('数据库','一个OID'))))
  0
  >>> CMP(厂(PersistentReference(
  ... ['M'('数据库','一个OID“,”一流的元数据')))
  ...厂(PersistentReference(
  ... ['M',('另一个数据库“,”一个OID“,”一流的元数据'))))
  -1
  >>> CMP(厂(PersistentReference(
  ... ['M'('数据库','一个OID“,”一流的元数据')))
  ...厂(PersistentReference(
  ......('的OID“,”一流的元数据'))))
 回溯(最近通话最后一个):
  ...
  ValueError错误:无法排序可靠
基于位置的连接适配器
函数zope.keyreference.connectionOfPersistent适应对象使用简单的基于位置的启发式的连接。它检查以查看是否该对象具有__parent__具有连接:
 从>>>进口zope.keyreference.persistent connectionOfPersistent
  >>> OB3 = PersistentMapping()
  >>>打印connectionOfPersistent(OB3)
 无
  >>> OB3 .__ parent__ = root2 ['OB1']
  >>> connectionOfPersistent(OB3)是CONN2
 真
什么是此版本中的新:
- 在修复测试通过去除测试依赖zope.testing破:避免需要它的ZODB3模块。
要求:
- 在Python中
评论没有发现