zope.keyreference teikia objektų nuorodų, kurios palaiko stabilų palyginimą ir maišas.
Pagrindinės Prašymai patvariųjų objektų
zope.keyreference.persistent.KeyReferenceToPersistent suteikia zope.keyreference.interfaces.IKeyReference nuorodą patvariųjų objektų.
Pažvelkime į pavyzdį. Pirma, mes sukurti keletą nuolatinių objektus duomenų bazėje:
& Nbsp; >>> iš ZODB.MappingStorage importo DB
& Nbsp; >>> importo sandoris
& Nbsp; >>> iš persistent.mapping importo PersistentMapping
& Nbsp; >>> db = BP ()
& Nbsp; >>> Conn = db.open ()
& Nbsp; >>> root = conn.root ()
& Nbsp; >>> šaknis ['ob1'] = PersistentMapping ()
& Nbsp; >>> šaknis ['OB2'] = PersistentMapping ()
& Nbsp; >>> transaction.commit ()
Tada mes sukurti keletą pagrindinių nuorodų:
& Nbsp; >>> iš zope.keyreference.persistent importo KeyReferenceToPersistent
& Nbsp; >>> key1 = KeyReferenceToPersistent (šaknų ['ob1'])
& Nbsp; >>> key2 = KeyReferenceToPersistent (šaknų ['OB2'])
Mes galime skambinti raktus gauti objektus:
& Nbsp; >>> key1 () yra šaknis ['ob1'], key2 () yra šaknis ['OB2']
& Nbsp; (Tiesa, tiesa)
Nauja raktai pačių objektų yra lygus amžiaus:
& Nbsp; >>> KeyReferenceToPersistent (šaknų ['ob1']) == key1
& Nbsp; Tiesa
ir turi tas pačias maišas:
& Nbsp; >>> maišos (KeyReferenceToPersistent (šaknų ['ob1'])) == maišos (key1)
& Nbsp; Tiesa
Kiti pagrindiniai pagalbos realizacijos skiriasi jų pagrindinis tipo ID. Pagrindinės nuorodos turėtų rūšiuoti pirmasis jų pagrindinis tipą ir, antra jokios informacijos tipo konkreti:
& Nbsp; >>> iš zope.interface importo padargai
& Nbsp; >>> iš zope.keyreference.interfaces importuoti IKeyReference
& Nbsp; >>> klasės DummyKeyReference (objektas):
& Nbsp; ... padargai (IKeyReference)
& Nbsp; ... key_type_id = 'zope.app.keyreference.object "
& Nbsp; ... Def __init __ (self, obj):
& Nbsp; ... self.object = obj
& Nbsp; ... Def __cmp __ (self, kita):
& Nbsp; ... jei self.key_type_id == other.key_type_id:
& Nbsp; ... grąža CMP (self.object, other.object)
& Nbsp; ... grąža CMP (self.key_type_id, other.key_type_id)
& Nbsp; >>> dummy_key1 = DummyKeyReference (objektas ())
& Nbsp; >>> dummy_key2 = DummyKeyReference (objektas ())
& Nbsp; >>> dummy_key3 = DummyKeyReference (objektas ())
& Nbsp; >>> raktai = [key1, dummy_key1, dummy_key2, key2, dummy_key3]
& Nbsp; >>> keys.sort ()
& Nbsp; >>> key_type_ids = [key.key_type_id už raktas raktų]
& Nbsp; >>> key_type_ids [0: 3] .count (zope.app.keyreference.object)
& Nbsp; 3
. & Nbsp; >>> key_type_ids [3] skaičiuoti ("zope.app.keyreference.persistent")
& Nbsp; 2
Mes saugoti pagrindines nuorodas duomenų bazėje:
& Nbsp; >>> šaknis ['key1'] = key1
& Nbsp; >>> šaknis ['key2'] = key2
ir mygtukais vėl saugoti objektus:
& Nbsp; >>> šaknis [key1] = šaknis ['ob1']
& Nbsp; >>> šaknis [key2] = šaknis ['OB2']
& Nbsp; >>> transaction.commit ()
Dabar mes atidaryti kitą ryšį:
& Nbsp; >>> conn2 = db.open ()
Ir įsitikinkite, kad mes galime naudoti raktus ieškoti objektus:
& Nbsp; >>> root2 = conn2.root ()
& Nbsp; >>> key1 = root2 ['key1']
& Nbsp; >>> root2 [key1] yra root2 ['ob1']
& Nbsp; Tiesa
& Nbsp; >>> key2 = root2 ['key2']
& Nbsp; >>> root2 [key2] yra root2 ['OB2']
& Nbsp; Tiesa
ir kad mes taip pat galime skambinti raktus gauti objektus:
& Nbsp; >>> key1 () yra root2 ['ob1']
& Nbsp; Tiesa
& Nbsp; >>> key2 () yra root2 ['OB2']
& Nbsp; Tiesa
Mes negalime gauti pagrindinį nuorodą apie objektą, kad nebuvo išsaugota dar:
& Nbsp; >>> KeyReferenceToPersistent (PersistentMapping ())
& Nbsp; ... # doctest + daugtaškis
& Nbsp; Traceback (naujausia skambutis paskutinis):
& Nbsp; ...
& Nbsp; NotYet: ...
Atkreipkite dėmesį, kad mes gauname NotYet klaidą. Tai rodo, kad galėtume gauti pagrindinį nuorodą vėliau.
Mes galime gauti nuorodas į neišsaugoti objektų, jei jie turi į ZODB.interfaces.IConnection adapterį. ĮDĖTI metodas, kai ryšys bus naudojamas suteikti objektą objektą ID, kuris yra pakankamai informacijos, kad apskaičiuoti nuorodą. Norėdami pamatyti šį, mes sukurti objektą, kuris atitinka IConnection į kvailas būdas:
& Nbsp; >>> import patvari
& Nbsp; >>> iš ZODB.interfaces importuoti IConnection
& Nbsp; >>> C klasės (persistent.Persistent):
& Nbsp; ... Def __conform __ (self, iface):
& Nbsp; ... jei iface yra IConnection:
& Nbsp; ... grąža conn2
& Nbsp; >>> ob3 = C ()
& Nbsp; >>> key3 = KeyReferenceToPersistent (ob3)
& Nbsp; >>> transaction.abort ()
Konfliktų sprendimas
Per konfliktus, kaip aptarta ZODB / ConflictResolution.txt nuorodos patvariųjų objektų yra iš tikrųjų atvejų ZODB.ConflictResolution.PersistentReference. Tai susiję dviem būdais KeyReferenceToPersistent. Pirma, ji paaiškina, kad klasės subtilybes: ji nėra paveldėti iš persistent.Persistent. Jei ji, tai nebūtų galima spręsti konfliktus, tiesiog jos PersistentReference stovimieji.
Antra, ji aiškina, kai iš __hash__ ir __cmp__ metodų kodą. Šie metodai ne tik tvarkyti persistent.Persistent objektus, bet PersistentReference objektus. Be šio elgesio, objektai, tokie kaip klasikinis ZODB BTrees, kad naudoti KeyReferenceToPersistent kaip raktų arba neįtvirtinti nariai negalės išspręsti konfliktus. Net su specialiu kodu, tam tikrais atvejais KeyReferenceToPersistent atsisako palyginti ir maišos per konfliktus, nes jis negali patikimai tai padaryti.
__hash__ dirbs gana retai, per konfliktus: tik multidatabase nuorodomis. Štai keli pavyzdžiai.
& Nbsp; >>> iš ZODB.ConflictResolution importo PersistentReference
& Nbsp; >>> def gamykla (teisėjas):
& Nbsp; ... res = KeyReferenceToPersistent .__ naują __ (
& Nbsp; ... KeyReferenceToPersistent, teisėjas)
& Nbsp; ... res.object = teisėjas
& Nbsp; ... grąžinimo res
& Nbsp; ...
& Nbsp; >>> maišos (gamyklinis (PersistentReference (
& Nbsp; ... (oid "," klasės metaduomenis ")))) # Tipinio
& Nbsp; Traceback (naujausia skambutis paskutinis):
& Nbsp; ...
& Nbsp; ValueError: duomenų bazės pavadinimą šiuo metu nepasiekiamas
& Nbsp; >>> bool (maišos (gamyklinis (PersistentReference (
& Nbsp; ... ["m", ("duomenų bazė", "oid", "klasės metaduomenys)])))) # multidatabase
& Nbsp; Tiesa
Tai reiškia, kad KeyReferenceToPersistent dažnai trukdo spręsti konfliktus klasių, pavyzdžiui, PersistentMapping.
__cmp__ veikia, nebent vienas objektas yra multidatabase nuoroda, o kita yra ne. Štai keletas pavyzdžių.
& Nbsp; >>> CMP (gamyklinis (PersistentReference (
& Nbsp; ... (oid "," klasės metaduomenis "))),
& Nbsp; ... gamykla (PersistentReference (
& Nbsp; ... (oid "," klasės metaduomenis "))))
& Nbsp; 0
& Nbsp; >>> CMP (gamyklinis (PersistentReference (
& Nbsp; ... (oid "," klasės metaduomenis "))),
& Nbsp; ... gamykla (PersistentReference (
& Nbsp; ... (kita oid "," klasės metaduomenis "))))
& Nbsp; -1
& Nbsp; >>> CMP (gamyklinis (PersistentReference (oid)),
& Nbsp; ... gamykla (PersistentReference (
& Nbsp; ... (oid "," klasės metaduomenis "))))
& Nbsp; 0
& Nbsp; >>> CMP (gamyklinis (PersistentReference (oid)),
& Nbsp; ... gamykla (PersistentReference (
& Nbsp; ... (oid "," klasės metaduomenis "))))
& Nbsp; 0
& Nbsp; >>> CMP (gamyklinis (PersistentReference (
& Nbsp; ... ["m", ("duomenų bazę", "oid", "klasės metaduomenų")])),
& Nbsp; ... gamykla (PersistentReference (
& Nbsp; ... ["m", ("duomenų bazė", "oid", "klasės metaduomenys)])))
& Nbsp; 0
& Nbsp; >>> CMP (gamyklinis (PersistentReference (
& Nbsp; ... ["m", ("duomenų bazę", "oid", "klasės metaduomenų")])),
& Nbsp; ... gamykla (PersistentReference (
& Nbsp; ... ["n" ("duomenų bazė", "oid)])))
& Nbsp; 0
& Nbsp; >>> CMP (gamyklinis (PersistentReference (
& Nbsp; ... ["m", ("duomenų bazę", "oid", "klasės metaduomenų")])),
& Nbsp; ... gamykla (PersistentReference (
& Nbsp; ... ["m" ("kita duomenų bazė", "oid", "klasės metaduomenys)])))
& Nbsp; -1
& Nbsp; >>> CMP (gamyklinis (PersistentReference (
& Nbsp; ... ["m", ("duomenų bazę", "oid", "klasės metaduomenų")])),
& Nbsp; ... gamykla (PersistentReference (
& Nbsp; ... (oid "," klasės metaduomenis "))))
& Nbsp; Traceback (naujausia skambutis paskutinis):
& Nbsp; ...
& Nbsp; ValueError: negali rūšiuoti patikimai
Vieta pagrįstas ryšys adapteris
Funkcija zope.keyreference.connectionOfPersistent prisitaiko objektus į jungtis naudojant paprastą vietos nustatymu pagrįstas euristiką. Ji patikrino, ar objektas turi __parent__, kad turi ryšį:
& Nbsp; >>> iš zope.keyreference.persistent importo connectionOfPersistent
& Nbsp; >>> ob3 = PersistentMapping ()
& Nbsp; >>> print connectionOfPersistent (ob3)
& Nbsp; Nėra
& Nbsp; >>> ob3 .__ parent__ = root2 ['ob1']
& Nbsp; >>> connectionOfPersistent (ob3) yra conn2
& Nbsp; Tiesa
Kas naujo , šioje laidoje:
- Fix testai skirstomi pašalinant zope.testing iš bandymų priklausomybių: išvengti ZODB3 modulį, kad reikia.
Reikalavimai :
- Python
Komentarai nerastas