zope.keyreference

Software screenshot:
zope.keyreference
Podrobnosti Software:
Verze: 3.6.4
Datum uploadu: 15 Apr 15
Licence: Volný
Popularita: 1

Rating: nan/5 (Total Votes: 0)

zope.keyreference stanoví, objekt odkazy, které podporují stabilní srovnání a hashe.
Hlavní Žádosti o perzistentních objektů
zope.keyreference.persistent.KeyReferenceToPersistent poskytuje odkaz na zope.keyreference.interfaces.IKeyReference o perzistentních objektů.
Podívejme se na příklad. Nejprve si vytvoříme nějaké trvalé objekty v databázi:
& Nbsp; >>> od ZODB.MappingStorage import DB
& Nbsp; >>> import transakce
& Nbsp; >>> od persistent.mapping dovozu PersistentMapping
& Nbsp; >>> db = DB ()
& Nbsp; >>> Conn = db.open ()
& Nbsp; >>> root = conn.root ()
& Nbsp; >>> kořen ['OB1'] = PersistentMapping ()
& Nbsp; >>> kořen ['OB2'] = PersistentMapping ()
& Nbsp; >>> transaction.commit ()
Pak budeme vytvářet některé klíčové odkazy:
& Nbsp; >>> od zope.keyreference.persistent dovozu KeyReferenceToPersistent
& Nbsp; >>> key1 = KeyReferenceToPersistent (root ['OB1 "])
& Nbsp; >>> key2 = KeyReferenceToPersistent (root ['OB2'])
Můžeme nazvat klíče, aby si objekty:
& Nbsp; >>> key1 () je kořen ['OB1'], key2 () je kořen ['OB2']
& Nbsp; (pravda, True)
Nové klíče na stejné objekty jsou rovny staré:
& Nbsp; >>> KeyReferenceToPersistent (root ['OB1']) == key1
& Nbsp; pravda
a mají stejné hash:
& Nbsp; >>> hash (KeyReferenceToPersistent (root ['OB1'])) == hash (key1)
& Nbsp; pravda
Další klíčové referenční implementace se lišily od jejich klíčové typu id. Významné reference by měla vyřešit nejprve na jejich klíčové typu, a druhý na jakékoliv informace specifický typ:
& Nbsp; >>> od zope.interface dovozních nářadí
& Nbsp; >>> od zope.keyreference.interfaces import IKeyReference
& Nbsp; >>> třída DummyKeyReference (objekt):
& Nbsp; ... nářadí (IKeyReference)
& Nbsp; ... key_type_id = 'zope.app.keyreference.object'
& Nbsp; ... def __init __ (self, obj):
& Nbsp; ... self.object = obj
& Nbsp; ... def __cmp __ (self, jiné):
& Nbsp; ... pokud self.key_type_id == other.key_type_id:
& Nbsp; ... návrat cmp (self.object, other.object)
& Nbsp; ... návrat 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; >>> klíče = [key1, dummy_key1, dummy_key2, key2, dummy_key3]
& Nbsp; >>> keys.sort ()
& Nbsp; >>> key_type_ids = [key.key_type_id na klíč klíče]
& Nbsp; >>> key_type_ids [0: 3] .count ("zope.app.keyreference.object")
& Nbsp; 3
. & Nbsp; >>> key_type_ids [3:] počet ("zope.app.keyreference.persistent")
& Nbsp; 2
Budeme Kíč odkazy v databázi:
& Nbsp; >>> kořen ['key1'] = key1
& Nbsp; >>> kořen ['key2'] = key2
a pomocí tlačítek znovu zaznamenat objekty:
& Nbsp; >>> kořen [key1] = root ['OB1']
& Nbsp; >>> kořen [key2] = root ['OB2']
& Nbsp; >>> transaction.commit ()
Teď budeme otevírat další připojení:
& Nbsp; >>> conn2 = db.open ()
A ověřte, že můžeme použít klíče k vyhledání objektů:
& Nbsp; >>> root2 = conn2.root ()
& Nbsp; >>> key1 = root2 ['key1']
& Nbsp; >>> root2 [key1] je root2 ['OB1']
& Nbsp; pravda
& Nbsp; >>> key2 = root2 ['key2']
& Nbsp; >>> root2 [key2] je root2 ['OB2']
& Nbsp; pravda
a že můžeme volat klíče, aby si objekty:
& Nbsp; >>> key1 () je root2 ['OB1']
& Nbsp; pravda
& Nbsp; >>> key2 () je root2 ['OB2']
& Nbsp; pravda
Nemůžeme získat klíčový dokument pro objekt, který ještě nebyl uložen:
& Nbsp; >>> KeyReferenceToPersistent (PersistentMapping ())
& Nbsp; ... # doctest: + elipsa
& Nbsp; TraceBack (poslední hovor poslední):
& Nbsp; ...
& Nbsp; NotYet: ...
Všimněte si, že dostaneme chybu NotYet. To znamená, že bychom mohli být schopni získat klíčovou referenci později.
Můžeme se dostat odkazy na nevěřící objekty, pokud mají adaptér ZODB.interfaces.IConnection. Metoda add o spojení budou použity, aby objekt je objekt id, což je dostatek informací pro výpočet reference. Chcete-li vidět, budeme vytvořit objekt, který je v souladu s IConnection v hloupé způsobem:
& Nbsp; >>> import perzistentní
& Nbsp; >>> od ZODB.interfaces import IConnection
& Nbsp; >>> třídy C (persistent.Persistent):
& Nbsp; ... def __conform __ (self, iface):
& Nbsp; ... pokud iface je IConnection:
& Nbsp; ... návrat conn2
& Nbsp; >>> OB3 = C ()
& Nbsp; >>> KL3 = KeyReferenceToPersistent (OB3)
& Nbsp; >>> transaction.abort ()
Řešení konfliktů
Při řešení konfliktů, jak je popsáno v ZODB / ConflictResolution.txt, odkazy na perzistentních objektů jsou vlastně příklady ZODB.ConflictResolution.PersistentReference. To je vhodné v dvěma způsoby pro KeyReferenceToPersistent. Za prvé, to vysvětluje jemnost třídy: není dědit z persistent.Persistent. Je-li tomu tak bylo, nebylo by k dispozici pro řešení konfliktů, pouze jeho PersistentReference stojí-in.
Za druhé, to vysvětluje některé z kódu v __hash__ a __cmp__ metod. Tyto metody nejen zvládnout persistent.Persistent objekty, ale PersistentReference objekty. Bez tohoto chování, budou objekty, jako je klasický ZODB BTrees, které používají KeyReferenceToPersistent jako klíče a sady členů schopen vyřešit konflikty. I s speciálním kódem, v některých případech KeyReferenceToPersistent odmítne porovnávat a hash při řešení konfliktů, protože to nelze spolehlivě učinit.
__hash__ bude fungovat poměrně vzácně řešení konfliktů: pouze pro multidatabase odkazy. Zde je několik příkladů.
& Nbsp; >>> od ZODB.ConflictResolution dovozu PersistentReference
& Nbsp; >>> def výroby (ref):
& Nbsp; ... res = KeyReferenceToPersistent .__ nový __ (
& Nbsp; ... KeyReferenceToPersistent, ref)
& Nbsp; ... res.object = ref
& Nbsp; ... Návrat res
& Nbsp; ...
& Nbsp; >>> hash (z výroby (PersistentReference (
& Nbsp; ... ("OID", "metadata třída")))) # typického
& Nbsp; TraceBack (poslední hovor poslední):
& Nbsp; ...
& Nbsp; ValueError: název databáze k dispozici v tomto okamžiku
& Nbsp; >>> bool (hash (tovární (PersistentReference (
& Nbsp; ... ['m ", (" databáze "," OID "," metadata class ")])))) # multidatabase
& Nbsp; pravda
To znamená, že KeyReferenceToPersistent často bránit řešení konfliktů na výuku, jako PersistentMapping.
__cmp__ funguje, pokud jeden objekt je multidatabase referenční a druhý ne. Zde je několik příkladů.
& Nbsp; >>> CMP (z výroby (PersistentReference (
& Nbsp; ... ("OID", "metadata třída"))),
& Nbsp; ... výroby (PersistentReference (
& Nbsp; ... ("OID", "metadata třída"))))
& Nbsp; 0
& Nbsp; >>> CMP (z výroby (PersistentReference (
& Nbsp; ... ("OID", "metadata třída"))),
& Nbsp; ... výroby (PersistentReference (
& Nbsp; ... ("další OID ',' metadata třída"))))
& Nbsp; -1
& Nbsp; >>> CMP (z výroby (PersistentReference ("OID")),
& Nbsp; ... výroby (PersistentReference (
& Nbsp; ... ("OID", "metadata třída"))))
& Nbsp; 0
& Nbsp; >>> CMP (z výroby (PersistentReference ("OID")),
& Nbsp; ... výroby (PersistentReference (
& Nbsp; ... ("OID", "metadata třída"))))
& Nbsp; 0
& Nbsp; >>> CMP (z výroby (PersistentReference (
& Nbsp; ... ['m ", (" databáze "," OID "," třída metadata ")])),
& Nbsp; ... výroby (PersistentReference (
& Nbsp; ... ['m ", (" databáze "," OID "," metadata class ")])))
& Nbsp; 0
& Nbsp; >>> CMP (z výroby (PersistentReference (
& Nbsp; ... ['m ", (" databáze "," OID "," třída metadata ")])),
& Nbsp; ... výroby (PersistentReference (
& Nbsp; ... ['n', ("databáze", "OID")])))
& Nbsp; 0
& Nbsp; >>> CMP (z výroby (PersistentReference (
& Nbsp; ... ['m ", (" databáze "," OID "," třída metadata ")])),
& Nbsp; ... výroby (PersistentReference (
& Nbsp; ... ['m ", (" jiné databáze "," OID "," metadata class ")])))
& Nbsp; -1
& Nbsp; >>> CMP (z výroby (PersistentReference (
& Nbsp; ... ['m ", (" databáze "," OID "," třída metadata ")])),
& Nbsp; ... výroby (PersistentReference (
& Nbsp; ... ("OID", "metadata třída"))))
& Nbsp; TraceBack (poslední hovor poslední):
& Nbsp; ...
& Nbsp; ValueError: nelze spolehlivě sort
Umístění na bázi připojení adaptéru
Funkce zope.keyreference.connectionOfPersistent přizpůsobí objekty k připojení pomocí jednoduchého umístění na základě heuristické. To kontroluje, zda má objekt __parent__, který má připojení:
& Nbsp; >>> od zope.keyreference.persistent dovozu connectionOfPersistent
& Nbsp; >>> OB3 = PersistentMapping ()
& Nbsp; >>> print connectionOfPersistent (OB3)
& Nbsp; Žádná
& Nbsp; >>> OB3 .__ parent__ = root2 ['OB1']
& Nbsp; >>> connectionOfPersistent (OB3) je conn2
& Nbsp; true

Co je nového v této verzi:

  • Oprava testy zlomený odstraněním zope.testing ze zkušebních závislostí: vyhnout ZODB3 modul, který jej potřebuje.

Požadavky na :

  • Python

Ostatní software developer Zope Corporation and Contributors

five.customerize
five.customerize

20 Feb 15

zope.configuration
zope.configuration

14 Apr 15

zope.traversing
zope.traversing

11 May 15

zope.event
zope.event

14 Apr 15

Komentáře k zope.keyreference

Komentáře nebyl nalezen
Přidat komentář
Zapnout obrázky!