zope.keyreference

Yazılım ekran görüntüsü:
zope.keyreference
Yazılım detaylar:
Versiyon: 3.6.4
Qayıt: 15 Apr 15
Lisans: Ücretsiz
Popülerlik: 34

Rating: nan/5 (Total Votes: 0)

zope.keyreference istikrarlı karşılaştırma ve sağlamalarının destekleyen nesne başvurular sağlar.
Kalıcı Nesneler için Kilit Referanslar
zope.keyreference.persistent.KeyReferenceToPersistent kalıcı nesneler için bir zope.keyreference.interfaces.IKeyReference referans sağlar.
Bir örnek bakalım. Öncelikle, biz bir veritabanında bazı kalıcı nesneler oluşturmak gerekir:
& Nbsp; >>> gelen ZODB.MappingStorage ithalat DB
& Nbsp; >>> import işlemi
& Nbsp; >>> persistent.mapping ithalat PersistentMapping gelen
& Nbsp; >>> db = DB ()
& Nbsp; >>> bağl = Db.Open ()
& Nbsp; >>> kök = conn.root ()
& Nbsp; >>> root ['OB1'] = PersistentMapping ()
& Nbsp; >>> root ['Ob2'] = PersistentMapping ()
& Nbsp; >>> transaction.commit ()
Sonra bazı önemli referanslar oluşturmak gerekir:
& Nbsp; >>> zope.keyreference.persistent ithalat KeyReferenceToPersistent gelen
& Nbsp; >>> anahtarı1 = KeyReferenceToPersistent (root ['OB1'])
& Nbsp; >>> anahtar2 = KeyReferenceToPersistent (root ['Ob2'])
Biz nesneleri almak için tuşları arayabilirsiniz:
& Nbsp; >>> anahtarı1 () kök ['OB1'], anahtar2 () kök ['Ob2']
& Nbsp; (Doğru, Doğru)
Aynı nesnelere yeni tuşlar eski eşittir:
& Nbsp; >>> KeyReferenceToPersistent (root ['OB1']) == anahtarı1
& Nbsp; Doğru
aynı karma sahiptir:
& Nbsp; >>> karma (KeyReferenceToPersistent (root ['OB1'])) == karma (anahtarı1)
& Nbsp; Doğru
Diğer önemli referans uygulamaları kilit tipi id tarafından farklı edilmektedir. Anahtar referanslar her türlü özel bilgi ilk kilit türüne ve ikinci sıralamak gerekir:
& Nbsp; >>> zope.interface ithalat uygular gelen
& Nbsp; >>> zope.keyreference.interfaces IKeyReference ithal gelen
& Nbsp; >>> sınıf DummyKeyReference (nesne):
& Nbsp; ... uygular (IKeyReference)
& Nbsp; ... key_type_id = 'zope.app.keyreference.object'
& Nbsp; ... def __init __ (self, obj):
& Nbsp; ... self.object = obj
& Nbsp; ... def __cmp __ (self, diğer):
& Nbsp; ... eğer self.key_type_id == other.key_type_id:
& Nbsp; ... dönüş cmp (self.object, other.object)
& Nbsp; ... dönüş 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; >>> tuşları = [anahtarı1, dummy_key1, dummy_key2, anahtar2, dummy_key3]
& Nbsp; >>> keys.sort ()
& Nbsp; >>> key_type_ids = [key.key_type_id anahtarları anahtarı]
& Nbsp; >>> key_type_ids [0: 3] .count ('zope.app.keyreference.object')
& Nbsp; 3
. & Nbsp; >>> key_type_ids [3:] ('zope.app.keyreference.persistent') sayısı
& Nbsp; 2
Biz veritabanında anahtar başvuruları saklamak gerekir:
& Nbsp; >>> root ['anahtarı1'] = anahtarı1
& Nbsp; >>> root ['anahtar2'] = anahtar2
ve yine nesneleri saklamak için tuşlarını kullanın:
& Nbsp; >>> kök [anahtarı1] = root ['OB1']
& Nbsp; >>> kök [anahtar2] = root ['Ob2']
& Nbsp; >>> transaction.commit ()
Şimdi başka bir bağlantı açmak gerekir:
& Nbsp; >>> conn2 = Db.Open ()
Ve biz nesneleri aramak için tuşlarını kullanabilirsiniz doğrulayın:
& Nbsp; >>> root2 = conn2.root ()
& Nbsp; >>> anahtarı1 = root2 ['anahtarı1']
& Nbsp; >>> root2 [anahtarı1] root2 olduğunu ['OB1']
& Nbsp; Doğru
& Nbsp; >>> anahtar2 = root2 ['anahtar2']
& Nbsp; >>> root2 [anahtar2] root2 olan ['Ob2']
& Nbsp; Doğru
ve biz de nesneleri almak için tuşları arayabileceğiniz:
& Nbsp; >>> anahtarı1 () root2 olan ['OB1']
& Nbsp; Doğru
& Nbsp; >>> anahtar2 () root2 olan ['Ob2']
& Nbsp; Doğru
Henüz kaydedilmiş değil bir nesne için anahtar başvuru alınamıyor:
& Nbsp; >>> KeyReferenceToPersistent (PersistentMapping ())
& Nbsp; ... # doctest.testmod: + üç nokta
& Nbsp; traceback (en son çağrı son):
& Nbsp; ...
& Nbsp; Henüz değil: ...
Biz Henüz değil hatası alıyorum unutmayın. Bu daha sonra bir anahtar referans almak mümkün olabileceğini göstermektedir.
Onlar ZODB.interfaces.IConnection bir adaptör varsa biz kaydedilmemiş nesnelere başvurular alabilirsiniz. Bağlantıda eklenti yöntemi nesne referansı hesaplamak için yeterli bilgi bir nesne kimliği, vermek için kullanılacaktır. Bunu görmek için, bir aptal şekilde IConnection uyan bir nesne oluşturmak gerekir:
& Nbsp; >>> ithal kalıcı
& Nbsp; >>> ZODB.interfaces IConnection ithal gelen
& Nbsp; >>> C sınıfı (persistent.Persistent):
& Nbsp; ... def __conform __ (self, iface):
& Nbsp; ... iface IConnection edin:
& Nbsp; ... dönüş conn2
& Nbsp; >>> ob3 = C ()
& Nbsp; >>> key3 = KeyReferenceToPersistent (ob3)
& Nbsp; >>> transaction.abort ()
Çatışma Çözümü
ZODB / ConflictResolution.txt anlatıldığı gibi uyuşmazlık çözümü sırasında, kalıcı nesnelere başvurular aslında ZODB.ConflictResolution.PersistentReference örnekleridir. Bu KeyReferenceToPersistent için iki şekilde ilgili değildir. Birincisi, bu sınıfın bir incelik açıklıyor: bu persistent.Persistent devralan değildir. Öyle olsaydı, o sadece kendi PersistentReference stand-in, çatışma çözümü için kullanılabilir olmaz.
İkincisi, bu __hash__ ve __cmp__ yöntemleri kod bazı açıklar. Bu yöntemler sadece persistent.Persistent nesneleri, ancak PersistentReference nesneleri işlemez. Bu davranış olmadan, anahtarlar veya set üyeleri olarak KeyReferenceToPersistent kullanmak gibi klasik ZODB BTrees gibi nesneler, çatışmaları çözmek mümkün olmayacaktır. Hatta özel bir kod ile, bazı durumlarda KeyReferenceToPersistent güvenilir bunu yapamazsınız, çünkü çatışma çözümlemesi sırasında karşılaştırmak ve karma reddeder.
__hash__ çatışma çözümlemesi sırasında nispeten nadiren çalışacaktır: Sadece multidatabase başvuruları için. İşte örnek bir çift vardır.
& Nbsp; >>> ZODB.ConflictResolution ithalat PersistentReference gelen
& Nbsp; >>> def fabrikası (ref):
& Nbsp; ... res = KeyReferenceToPersistent .__ yeni __ (
& Nbsp; ... KeyReferenceToPersistent, ref)
& Nbsp; ... res.object = ref
& Nbsp; ... dönüş res
& Nbsp; ...
& Nbsp; >>> karma (fabrika (PersistentReference (
& Nbsp; ... ('bir oid', 'sınıf meta')))) # tipik bir referans
& Nbsp; traceback (en son çağrı son):
& Nbsp; ...
& Nbsp; ValueError: şu anda veritabanı adı kullanılamıyor
& Nbsp; >>> bool (hash (fabrika (PersistentReference (
& Nbsp; ... ['m', ('veritabanı', 'bir oid', 'sınıf meta')])))) # multidatabase
& Nbsp; Doğru
Bu KeyReferenceToPersistent genellikle PersistentMapping gibi sınıflar için çakışma çözünürlüğü engel anlamına gelir.
bir amacı, bir multidatabase bir referans ve diğerinin olmadıkça __cmp__ çalışır. İşte birkaç örnek.
& Nbsp; >>> cmp (fabrika (PersistentReference (
& Nbsp; ... ('bir oid', 'sınıf meta'))),
& Nbsp; ... Fabrika (PersistentReference (
& Nbsp; ... ('bir oid', 'sınıf meta'))))
& Nbsp; 0
& Nbsp; >>> cmp (fabrika (PersistentReference (
& Nbsp; ... ('bir oid', 'sınıf meta'))),
& Nbsp; ... Fabrika (PersistentReference (
& Nbsp; ... ('Başka oid', 'sınıf meta'))))
& Nbsp; -1
& Nbsp; >>> cmp (fabrika (PersistentReference ('bir oid')),
& Nbsp; ... Fabrika (PersistentReference (
& Nbsp; ... ('bir oid', 'sınıf meta'))))
& Nbsp; 0
& Nbsp; >>> cmp (fabrika (PersistentReference ('bir oid')),
& Nbsp; ... Fabrika (PersistentReference (
& Nbsp; ... ('bir oid', 'sınıf meta'))))
& Nbsp; 0
& Nbsp; >>> cmp (fabrika (PersistentReference (
& Nbsp; ... ['m', ('bir veritabanı', 'bir oid', 'sınıf meta')])),
& Nbsp; ... Fabrika (PersistentReference (
& Nbsp; ... ['m', ('veritabanı', 'bir oid', 'sınıf meta')])))
& Nbsp; 0
& Nbsp; >>> cmp (fabrika (PersistentReference (
& Nbsp; ... ['m', ('bir veritabanı', 'bir oid', 'sınıf meta')])),
& Nbsp; ... Fabrika (PersistentReference (
& Nbsp; ... ['n', ('veritabanı', 'bir oid')])))
& Nbsp; 0
& Nbsp; >>> cmp (fabrika (PersistentReference (
& Nbsp; ... ['m', ('bir veritabanı', 'bir oid', 'sınıf meta')])),
& Nbsp; ... Fabrika (PersistentReference (
& Nbsp; ... ['m', ('başka bir veritabanı', 'bir oid', 'sınıf meta')])))
& Nbsp; -1
& Nbsp; >>> cmp (fabrika (PersistentReference (
& Nbsp; ... ['m', ('bir veritabanı', 'bir oid', 'sınıf meta')])),
& Nbsp; ... Fabrika (PersistentReference (
& Nbsp; ... ('bir oid', 'sınıf meta'))))
& Nbsp; traceback (en son çağrı son):
& Nbsp; ...
& Nbsp; ValueError: sıralama güvenilir olamaz
Konum tabanlı bağlantı adaptörü
Fonksiyon zope.keyreference.connectionOfPersistent basit bir konum tabanlı sezgisel kullanarak bağlantıları nesneleri uyarlar. Bu nesnenin bir bağlantısı olan bir __parent__ olup olmadığını görmek için kontrol:
& Nbsp; >>> zope.keyreference.persistent ithalat connectionOfPersistent gelen
& Nbsp; >>> ob3 = PersistentMapping ()
& Nbsp; >>> print connectionOfPersistent (ob3)
& Nbsp; Yoktur
& Nbsp; >>> ob3 .__ parent__ = root2 ['OB1'in']
& Nbsp; >>> connectionOfPersistent (ob3) conn2 olduğunu
& Nbsp; Doğru

Bu sürümde Yeni nedir:

  • Fix testleri Test bağımlılıkları zope.testing çıkarılmasıyla kırılmış: ihtiyacı ZODB3 modülünü kaçının.

Gereksinimler :

  • Python

Geliştirici Diğer yazılım Zope Corporation and Contributors

Yorumlar zope.keyreference

Yorum Bulunamadı
Yorum eklemek
Görüntülerde açın!