zope.keyreference

Software screenshot:
zope.keyreference
Rincian Software:
Versi: 3.6.4
Tanggal Upload: 15 Apr 15
Lisensi: Gratis
Popularitas: 1

Rating: nan/5 (Total Votes: 0)

zope.keyreference menyediakan referensi objek yang mendukung perbandingan stabil dan hash.
Referensi kunci untuk Objects Persistent
zope.keyreference.persistent.KeyReferenceToPersistent memberikan referensi zope.keyreference.interfaces.IKeyReference untuk objek persisten.
Mari kita lihat sebuah contoh. Pertama, kita akan membuat beberapa objek terus-menerus dalam database:
& Nbsp; >>> dari ZODB.MappingStorage impor DB
& Nbsp; >>> transaksi impor
& Nbsp; >>> dari persistent.mapping impor PersistentMapping
& Nbsp; >>> db = DB ()
& Nbsp; >>> conn = db.open ()
& Nbsp; >>> root = conn.root ()
& Nbsp; >>> akar ['OB1'] = PersistentMapping ()
& Nbsp; >>> akar ['OB2'] = PersistentMapping ()
& Nbsp; >>> transaction.Commit ()
Kemudian kita akan membuat beberapa referensi kunci:
& Nbsp; >>> dari zope.keyreference.persistent impor KeyReferenceToPersistent
& Nbsp; >>> key1 = KeyReferenceToPersistent (root ['OB1'])
& Nbsp; >>> key2 = KeyReferenceToPersistent (root ['OB2'])
Kita bisa memanggil kunci untuk mendapatkan benda:
& Nbsp; >>> key1 () adalah akar ['OB1'], key2 () adalah akar ['OB2']
& Nbsp; (Benar, Benar)
Kunci baru ke objek yang sama adalah sama dengan yang lama:
& Nbsp; >>> KeyReferenceToPersistent (root ['OB1']) == key1
& Nbsp; Benar
dan memiliki hash yang sama:
& Nbsp; >>> hash (KeyReferenceToPersistent (root ['OB1'])) == hash (key1)
& Nbsp; Benar
Implementasi referensi utama lainnya dibedakan menurut jenis id utama mereka. Referensi utama harus mengurutkan pertama pada jenis kunci mereka dan kedua pada informasi-jenis tertentu:
& Nbsp; >>> dari zope.interface alat impor
& Nbsp; >>> dari zope.keyreference.interfaces impor IKeyReference
& Nbsp; >>> kelas DummyKeyReference (object):
& Nbsp; ... alat (IKeyReference)
& Nbsp; ... key_type_id = 'zope.app.keyreference.object'
& Nbsp; ... def __init __ (self, obj):
& Nbsp; ... self.object = obj
& Nbsp; ... def __cmp __ (self, lainnya):
& Nbsp; ... jika self.key_type_id == other.key_type_id:
& Nbsp; ... kembali CMP (self.object, other.object)
& Nbsp; ... kembali CMP (self.key_type_id, other.key_type_id)
& Nbsp; >>> dummy_key1 = DummyKeyReference (object ())
& Nbsp; >>> dummy_key2 = DummyKeyReference (object ())
& Nbsp; >>> dummy_key3 = DummyKeyReference (object ())
& Nbsp; >>> kunci = [key1, dummy_key1, dummy_key2, key2, dummy_key3]
& Nbsp; >>> keys.sort ()
& Nbsp; >>> key_type_ids = [key.key_type_id untuk kunci dalam kunci]
& Nbsp; >>> key_type_ids [0: 3] Count ('zope.app.keyreference.object')
& Nbsp; 3
. & Nbsp; >>> key_type_ids [3:] count ('zope.app.keyreference.persistent')
& Nbsp; 2
Kami akan menyimpan referensi utama dalam database:
& Nbsp; >>> akar ['key1'] = key1
& Nbsp; >>> akar ['key2'] = key2
dan gunakan tombol untuk menyimpan benda-benda lagi:
& Nbsp; >>> akar [key1] = root ['OB1']
& Nbsp; >>> akar [key2] = root ['OB2']
& Nbsp; >>> transaction.Commit ()
Sekarang kita akan membuka koneksi lain:
& Nbsp; >>> conn2 = db.open ()
Dan memverifikasi bahwa kita dapat menggunakan tombol untuk mencari benda-benda:
& Nbsp; >>> root2 = conn2.root ()
& Nbsp; >>> key1 = root2 ['key1']
& Nbsp; >>> root2 [key1] adalah root2 ['OB1']
& Nbsp; Benar
& Nbsp; >>> key2 = root2 ['key2']
& Nbsp; >>> root2 [key2] adalah root2 ['OB2']
& Nbsp; Benar
dan bahwa kami juga bisa memanggil kunci untuk mendapatkan benda:
& Nbsp; >>> key1 () adalah root2 ['OB1']
& Nbsp; Benar
& Nbsp; >>> key2 () adalah root2 ['OB2']
& Nbsp; Benar
Kita tidak bisa mendapatkan referensi utama bagi sebuah objek yang belum disimpan:
& Nbsp; >>> KeyReferenceToPersistent (PersistentMapping ())
& Nbsp; ... # doctest: + elipsis
& Nbsp; Traceback (panggilan terbaru terakhir):
& Nbsp; ...
& Nbsp; NotYet: ...
Perhatikan bahwa kita mendapatkan kesalahan NotYet. Hal ini menunjukkan bahwa kita mungkin bisa mendapatkan referensi utama kemudian.
Kita bisa mendapatkan referensi ke objek yang belum diselamatkan jika mereka memiliki adaptor untuk ZODB.interfaces.IConnection. Add metode pada koneksi akan digunakan untuk memberikan objek id objek, yang merupakan informasi yang cukup untuk menghitung referensi. Untuk melihat ini, kita akan membuat objek yang sesuai dengan IConnection dengan cara konyol:
& Nbsp; >>> impor terus-menerus
& Nbsp; >>> dari ZODB.interfaces impor IConnection
& Nbsp; >>> kelas C (persistent.Persistent):
& Nbsp; ... def __conform __ (self, iface):
& Nbsp; ... jika iface adalah IConnection:
& Nbsp; ... kembali conn2
& Nbsp; >>> ob3 = C ()
& Nbsp; >>> key3 = KeyReferenceToPersistent (ob3)
& Nbsp; >>> transaction.abort ()
Resolusi Konflik
Selama resolusi konflik, seperti yang dibahas dalam ZODB / ConflictResolution.txt, referensi ke obyek persisten sebenarnya contoh ZODB.ConflictResolution.PersistentReference. Hal ini terkait dengan dua cara untuk KeyReferenceToPersistent. Pertama, menjelaskan kehalusan kelas: tidak mewarisi dari persistent.Persistent. Jika itu terjadi, itu tidak akan tersedia untuk resolusi konflik, hanya PersistentReference yang berdiri-in.
Kedua, ia menjelaskan beberapa kode dalam __hash__ dan __cmp__ metode. Metode ini tidak hanya menangani objek persistent.Persistent, tapi benda PersistentReference. Tanpa perilaku ini, benda-benda, seperti klasik ZODB BTrees, yang menggunakan KeyReferenceToPersistent sebagai kunci atau set anggota akan dapat menyelesaikan konflik. Bahkan dengan kode khusus, dalam beberapa kasus KeyReferenceToPersistent akan menolak untuk membandingkan dan hash selama resolusi konflik karena tidak bisa dipercaya melakukannya.
__hash__ akan bekerja relatif jarang selama resolusi konflik: hanya untuk referensi multidatabase. Berikut adalah beberapa contoh.
& Nbsp; >>> dari ZODB.ConflictResolution impor PersistentReference
& Nbsp; >>> pabrik def (ref):
& Nbsp; ... res = KeyReferenceToPersistent .__ baru __ (
& Nbsp; ... KeyReferenceToPersistent, ref)
& Nbsp; ... res.object = ref
& Nbsp; ... kembali res
& Nbsp; ...
& Nbsp; >>> hash (pabrik (PersistentReference (
& Nbsp; ... (, "kelas metadata '' an oid ')))) # referensi khas
& Nbsp; Traceback (panggilan terbaru terakhir):
& Nbsp; ...
& Nbsp; ValueError: nama database tidak tersedia saat ini
& Nbsp; >>> bool (hash (pabrik (PersistentReference (
& Nbsp; ... ['m', ('database', 'an oid', 'kelas metadata')])))) # multidatabase
& Nbsp; Benar
Ini berarti bahwa KeyReferenceToPersistent akan sering menghambat resolusi konflik untuk kelas seperti PersistentMapping.
__cmp__ bekerja kecuali satu objek adalah referensi multidatabase dan yang lainnya tidak. Berikut adalah beberapa contoh.
& Nbsp; >>> CMP (pabrik (PersistentReference (
& Nbsp; ... ('an oid', 'kelas metadata'))),
& Nbsp; ... pabrik (PersistentReference (
& Nbsp; ... ('an oid', 'kelas metadata'))))
& Nbsp; 0
& Nbsp; >>> CMP (pabrik (PersistentReference (
& Nbsp; ... ('an oid', 'kelas metadata'))),
& Nbsp; ... pabrik (PersistentReference (
& Nbsp; ... ('lain oid', 'kelas metadata'))))
& Nbsp; -1
& Nbsp; >>> CMP (pabrik (PersistentReference ('an oid')),
& Nbsp; ... pabrik (PersistentReference (
& Nbsp; ... ('an oid', 'kelas metadata'))))
& Nbsp; 0
& Nbsp; >>> CMP (pabrik (PersistentReference ('an oid')),
& Nbsp; ... pabrik (PersistentReference (
& Nbsp; ... ('an oid', 'kelas metadata'))))
& Nbsp; 0
& Nbsp; >>> CMP (pabrik (PersistentReference (
& Nbsp; ... ['m', ('database', 'an oid', 'metadata kelas')])),
& Nbsp; ... pabrik (PersistentReference (
& Nbsp; ... ['m', ('database', 'an oid', 'kelas metadata')])))
& Nbsp; 0
& Nbsp; >>> CMP (pabrik (PersistentReference (
& Nbsp; ... ['m', ('database', 'an oid', 'metadata kelas')])),
& Nbsp; ... pabrik (PersistentReference (
& Nbsp; ... ['n', ('database', 'an oid')])))
& Nbsp; 0
& Nbsp; >>> CMP (pabrik (PersistentReference (
& Nbsp; ... ['m', ('database', 'an oid', 'metadata kelas')])),
& Nbsp; ... pabrik (PersistentReference (
& Nbsp; ... ['m', ('lain database', 'an oid', 'kelas metadata')])))
& Nbsp; -1
& Nbsp; >>> CMP (pabrik (PersistentReference (
& Nbsp; ... ['m', ('database', 'an oid', 'metadata kelas')])),
& Nbsp; ... pabrik (PersistentReference (
& Nbsp; ... ('an oid', 'kelas metadata'))))
& Nbsp; Traceback (panggilan terbaru terakhir):
& Nbsp; ...
& Nbsp; ValueError: tidak bisa semacam andal
berbasis lokasi sambungan adapter
Fungsi zope.keyreference.connectionOfPersistent menyesuaikan objek untuk koneksi menggunakan berbasis lokasi heuristic sederhana. Diperiksa untuk melihat apakah objek memiliki __parent__ yang memiliki sambungan:
& Nbsp; >>> dari zope.keyreference.persistent impor connectionOfPersistent
& Nbsp; >>> ob3 = PersistentMapping ()
& Nbsp; >>> print connectionOfPersistent (ob3)
& Nbsp; Tidak ada
& Nbsp; >>> ob3 .__ parent__ = root2 ['OB1']
& Nbsp; >>> connectionOfPersistent (ob3) adalah conn2
& Nbsp; Benar

Apa yang baru dalam rilis ini:

  • tes Fix rusak oleh penghapusan zope.testing dari ketergantungan uji: menghindari modul ZODB3 yang memerlukannya.

Persyaratan :

  • Python

Perangkat lunak lain dari pengembang Zope Corporation and Contributors

zope.app.testing
zope.app.testing

14 Apr 15

zope.proxy
zope.proxy

14 Apr 15

refline.srccheck
refline.srccheck

14 Apr 15

Komentar untuk zope.keyreference

Komentar tidak ditemukan
Tambahkan komentar
Aktifkan gambar!