zope.keyreference

Software kuvakaappaus:
zope.keyreference
Ohjelmiston tiedot:
Versio: 3.6.4
Lähetyksen päivämäärä: 15 Apr 15
Lupa: Vapaa
Suosio: 1

Rating: nan/5 (Total Votes: 0)

zope.keyreference säädetään esine viittauksia, jotka tukevat vakaata vertailu ja hash.
Key Viittaukset pysyviä Objects
zope.keyreference.persistent.KeyReferenceToPersistent tarjoaa zope.keyreference.interfaces.IKeyReference viittaus pysyviä esineitä.
Katsotaanpa esimerkki. Ensinnäkin, me luoda joitakin pysyviä objekteja tietokantaan:
& Nbsp; >>> päässä ZODB.MappingStorage tuonti DB
& Nbsp; >>> tuonti kauppa
& Nbsp; >>> päässä persistent.mapping tuonti PersistentMapping
& Nbsp; >>> db = DB ()
& Nbsp; >>> yht = db.open ()
& Nbsp; >>> root = conn.root ()
& Nbsp; >>> root ['OB1'] = PersistentMapping ()
& Nbsp; >>> root ['Ob2'] = PersistentMapping ()
& Nbsp; >>> transaction.commit ()
Sitten luomme joitakin keskeisiä viitteitä:
& Nbsp; >>> päässä zope.keyreference.persistent tuonti KeyReferenceToPersistent
& Nbsp; >>> key1 = KeyReferenceToPersistent (root ['OB1'])
& Nbsp; >>> AV.2 = KeyReferenceToPersistent (root ['Ob2'])
Voimme soittaa avaimet saada esineitä:
& Nbsp; >>> key1 () on root ['OB1'], AV.2 () on root ['Ob2']
& Nbsp; (True, True)
Uusia avaimia saman esineitä ovat yhtä vanhoja:
& Nbsp; >>> KeyReferenceToPersistent (root ['OB1']) == key1
& Nbsp; True
ja on sama hash:
& Nbsp; >>> hash (KeyReferenceToPersistent (root ['OB1'])) == hash (key1)
& Nbsp; True
Muita keskeisiä viittaus toteutuksia erosivat niiden keskeisten tunnus. Tärkeimmät viittaukset olisi lajitella ensin niiden keskeisten tyypin ja toinen millekään erityisiä tietoja:
& Nbsp; >>> päässä zope.interface tuonti työkoneet
& Nbsp; >>> päässä zope.keyreference.interfaces tuoda IKeyReference
& Nbsp; >>> luokan DummyKeyReference (objekti):
& Nbsp; ... työkoneiden (IKeyReference)
& Nbsp; ... key_type_id = 'zope.app.keyreference.object'
& Nbsp; ... def __init __ (self, obj):
& Nbsp; ... self.object = obj
& Nbsp; ... def __cmp __ (self, muut):
& Nbsp; ... jos self.key_type_id == other.key_type_id:
& Nbsp; ... paluu CMP (self.object, other.object)
& Nbsp; ... paluu CMP (self.key_type_id, other.key_type_id)
& Nbsp; >>> dummy_key1 = DummyKeyReference (objekti ())
& Nbsp; >>> dummy_key2 = DummyKeyReference (objekti ())
& Nbsp; >>> dummy_key3 = DummyKeyReference (objekti ())
& Nbsp; >>> avaimet = [key1, dummy_key1, dummy_key2, AV.2, dummy_key3]
& Nbsp; >>> keys.sort ()
& Nbsp; >>> key_type_ids = [key.key_type_id varten avain avaimet]
& 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
Me tallentaa avainviitteitä tietokannassa:
& Nbsp; >>> root ['key1'] = key1
& Nbsp; >>> root ['AV.2'] = AV.2
ja käytä näppäimiä tallentaa esineitä uudelleen:
& Nbsp; >>> root [key1] = root ['OB1']
& Nbsp; >>> root [AV.2] = root ['Ob2']
& Nbsp; >>> transaction.commit ()
Nyt avaamme toisen yhteyden:
& Nbsp; >>> conn2 = db.open ()
Ja varmista, että voimme käyttää avaimia etsiä esineitä:
& Nbsp; >>> root2 = conn2.root ()
& Nbsp; >>> key1 = root2 ['key1']
& Nbsp; >>> root2 [key1] on root2 ['OB1']
& Nbsp; True
& Nbsp; >>> AV.2 = root2 ['AV.2']
& Nbsp; >>> root2 [AV.2] on root2 ['Ob2']
& Nbsp; True
ja että voimme myös soittaa avaimet saada esineitä:
& Nbsp; >>> key1 () on root2 ['OB1']
& Nbsp; True
& Nbsp; >>> AV.2 () on root2 ['Ob2']
& Nbsp; True
Emme voi saada peruslähtökohtana esine, jota ei ole vielä tallennettu:
& Nbsp; >>> KeyReferenceToPersistent (PersistentMapping ())
& Nbsp; ... # doctest: + ELLIPSIS
& Nbsp; Jäljitys (viimeisin puhelu viimeinen):
& Nbsp; ...
& Nbsp; NotYet: ...
Huomaa, että saamme NotYet virhe. Tämä osoittaa, että voisimme saada avain myöhempää.
Voimme saada viittauksia tallentamattomat esineet, jos ne on sovitin ZODB.interfaces.IConnection. Add menetelmää yhteyden käytetään antamaan esineen kohteen ID, joka on tarpeeksi tietoa viite. Voit nähdä tämän, luomme objekti, joka vastaa IConnection vuonna typerä tavalla:
& Nbsp; >>> tuonti pysyviä
& Nbsp; >>> päässä ZODB.interfaces tuoda IConnection
& Nbsp; >>> luokka C (persistent.Persistent):
& Nbsp; ... def __conform __ (self, IFACE):
& Nbsp; ... jos IFACE on IConnection:
& Nbsp; ... paluu conn2
& Nbsp; >>> ob3 = C ()
& Nbsp; >>> AV.3 = KeyReferenceToPersistent (ob3)
& Nbsp; >>> transaction.abort ()
konfliktinratkaisu
Vuoden konfliktien ratkaisemiseen, joita käsitellään ZODB / ConflictResolution.txt viittaukset pysyviä esineet ovat todella tapauksia ZODB.ConflictResolution.PersistentReference. Tämä kuuluu asiaan kahdella tavalla KeyReferenceToPersistent. Ensinnäkin se kertoo hienovaraisuus luokka: se ei perivät persistent.Persistent. Jos se ei, se ei olisi käytettävissä konfliktien ratkaisuun, juuri sen PersistentReference stand-in.
Toiseksi, se selittää joitakin koodin __hash__ ja __cmp__ menetelmiä. Nämä menetelmät eivät vain käsittele persistent.Persistent esineitä, mutta PersistentReference esineitä. Ilman tätä käyttäytymistä, esineitä, kuten klassinen ZODB BTrees, jotka käyttävät KeyReferenceToPersistent kuten avaimia tai joukko jäseniä ei pysty ratkaisemaan konflikteja. Vaikka erityinen koodi, joissakin tapauksissa KeyReferenceToPersistent kieltäytyy vertailla ja hash aikana konfliktien ratkaisuun, koska se ei voi luotettavasti tehdä.
__hash__ toimii suhteellisen harvoin konfliktien ratkaisemiseen: vain multidatabase viittauksia. Tässä pari esimerkkiä.
& Nbsp; >>> päässä ZODB.ConflictResolution tuonti PersistentReference
& Nbsp; >>> def tehdas (viite):
& Nbsp; ... res = KeyReferenceToPersistent .__ uusi __ (
& Nbsp; ... KeyReferenceToPersistent, viite)
& Nbsp; ... res.object = tuomari
& Nbsp; ... paluu res
& Nbsp; ...
& Nbsp; >>> hash (tehdas (PersistentReference (
& Nbsp; ... (OID ',' luokan metadata ')))) # tyypillinen viite
& Nbsp; Jäljitys (viimeisin puhelu viimeinen):
& Nbsp; ...
& Nbsp; ValueError: tietokannan nimi ole tällä kertaa
& Nbsp; >>> bool (hash (tehtaan (PersistentReference (
& Nbsp; ... ['m', ('tietokanta', 'OID', 'luokan metadata')])))) # multidatabase
& Nbsp; True
Tämä tarkoittaa sitä, että KeyReferenceToPersistent usein estää konfliktien ratkaisemiseen luokissa kuten PersistentMapping.
__cmp__ toimii jollei yksi esine on multidatabase viittaus ja toinen ei. Tässä muutamia esimerkkejä.
& Nbsp; >>> CMP (tehdas (PersistentReference (
& Nbsp; ... (OID ',' luokan metadata '))),
& Nbsp; ... tehdas (PersistentReference (
& Nbsp; ... (OID ',' luokan metadata '))))
& Nbsp; 0
& Nbsp; >>> CMP (tehdas (PersistentReference (
& Nbsp; ... (OID ',' luokan metadata '))),
& Nbsp; ... tehdas (PersistentReference (
& Nbsp; ... ("toinen -oidiset ',' luokan metadata '))))
& Nbsp; -1
& Nbsp; >>> CMP (tehdas (PersistentReference (OID)),
& Nbsp; ... tehdas (PersistentReference (
& Nbsp; ... (OID ',' luokan metadata '))))
& Nbsp; 0
& Nbsp; >>> CMP (tehdas (PersistentReference (OID)),
& Nbsp; ... tehdas (PersistentReference (
& Nbsp; ... (OID ',' luokan metadata '))))
& Nbsp; 0
& Nbsp; >>> CMP (tehdas (PersistentReference (
& Nbsp; ... ['m', ('tietokanta', 'OID', 'luokan metadata')])),
& Nbsp; ... tehdas (PersistentReference (
& Nbsp; ... ['m', ('tietokanta', 'OID', 'luokan metadata')])))
& Nbsp; 0
& Nbsp; >>> CMP (tehdas (PersistentReference (
& Nbsp; ... ['m', ('tietokanta', 'OID', 'luokan metadata')])),
& Nbsp; ... tehdas (PersistentReference (
& Nbsp; ... ['n', ('tietokanta', 'OID)])))
& Nbsp; 0
& Nbsp; >>> CMP (tehdas (PersistentReference (
& Nbsp; ... ['m', ('tietokanta', 'OID', 'luokan metadata')])),
& Nbsp; ... tehdas (PersistentReference (
& Nbsp; ... ['m', ('toinen tietokanta', 'OID', 'luokan metadata')])))
& Nbsp; -1
& Nbsp; >>> CMP (tehdas (PersistentReference (
& Nbsp; ... ['m', ('tietokanta', 'OID', 'luokan metadata')])),
& Nbsp; ... tehdas (PersistentReference (
& Nbsp; ... (OID ',' luokan metadata '))))
& Nbsp; Jäljitys (viimeisin puhelu viimeinen):
& Nbsp; ...
& Nbsp; ValueError: ei voi lajitella luotettavasti
Sijainti perustuvia liitäntäadapteriin
Toiminto zope.keyreference.connectionOfPersistent mukautuu esineitä yhteyksiä käyttäen yksinkertaisia ​​sijaintiin perustuvia heuristinen. Se tarkastetaan, onko esine on __parent__ että on yhteys:
& Nbsp; >>> päässä zope.keyreference.persistent tuonti connectionOfPersistent
& Nbsp; >>> ob3 = PersistentMapping ()
& Nbsp; >>> print connectionOfPersistent (ob3)
& Nbsp; Ei
& Nbsp; >>> ob3 .__ parent__ = root2 ['OB1']
& Nbsp; >>> connectionOfPersistent (ob3) on conn2
& Nbsp; True

Mitä uutta tässä julkaisussa:

  • Fix testit rikki poistamalla zope.testing testistä riippuvuudet: välttää ZODB3 moduuli, joka tarvitsee sitä.

Vaatimukset :

  • Python

Muu ohjelmistojen kehittäjä Zope Corporation and Contributors

Kommentit zope.keyreference

Kommentteja ei löytynyt
Lisää kommentti
Ota kuvia!