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中
評論沒有發現