zope.keyreference

Софтуер снимки:
zope.keyreference
Софтуер детайли:
Версия: 3.6.4
Дата на качване: 15 Apr 15
Разрешително: Безплатно
Популярност: 34

Rating: nan/5 (Total Votes: 0)

zope.keyreference предоставя референции на обекти, които поддържат стабилни цени и хешове.
<Силни> Основни препратки за устойчивите Objects
zope.keyreference.persistent.KeyReferenceToPersistent осигурява zope.keyreference.interfaces.IKeyReference справка за постоянни обекти.
Нека разгледаме един пример. Първо, ние ще създадем някои постоянни обекти в базата данни:
& Nbsp; >>> от ZODB.MappingStorage внос DB
& Nbsp; >>> сделка за внос
& Nbsp; >>> от persistent.mapping внос PersistentMapping
& Nbsp; >>> db = DB ()
& Nbsp; >>> вр = db.open ()
& Nbsp; >>> корен = conn.root ()
& Nbsp; >>> корен ['OB1'] = PersistentMapping ()
& Nbsp; >>> корен ['OB2'] = PersistentMapping ()
& Nbsp; >>> transaction.commit ()
След това ще създаде някои ключови препоръки:
& Nbsp; >>> от zope.keyreference.persistent внос KeyReferenceToPersistent
& Nbsp; >>> key1 = KeyReferenceToPersistent (корен ['OB1'])
& Nbsp; >>> key2 = KeyReferenceToPersistent (корен ['OB2'])
Можем да наречем ключовете, за да получите на обектите:
& Nbsp; >>> key1 () е корен ['OB1 "], key2 () е корен [' OB2"]
& Nbsp; (True, True)
Нови ключове и същи предмети са равни на старите:
& Nbsp; >>> KeyReferenceToPersistent (корен ['OB1']) == key1
& Nbsp; True
и има същите хешове:
& Nbsp; >>> хеш (KeyReferenceToPersistent (корен ['OB1'])) == хеш (key1)
& Nbsp; True
Други ключови референтни имплементации са се различавали от ключово техния вид ID. Основни препратки трябва да сортират първо на ключовата им вид и втори на всякакъв тип-специфична информация:
& Nbsp; >>> от сечива внос zope.interface
& Nbsp; >>> от zope.keyreference.interfaces внасят IKeyReference
& Nbsp; >>> клас DummyKeyReference (обект):
& Nbsp; ... сечива (IKeyReference)
& Nbsp; ... key_type_id = "zope.app.keyreference.object"
& Nbsp; ... Def __init __ (самостоятелно, OBJ):
& Nbsp; ... self.object = OBJ
& Nbsp; ... Def __cmp __ (самостоятелно, други):
& Nbsp; ... ако self.key_type_id == other.key_type_id:
& Nbsp; ... завръщане CMP (self.object, other.object)
& Nbsp; ... завръщане CMP (self.key_type_id, other.key_type_id)
& Nbsp; >>> dummy_key1 = DummyKeyReference (обект ())
& Nbsp; >>> dummy_key2 = DummyKeyReference (обект ())
& Nbsp; >>> dummy_key3 = DummyKeyReference (обект ())
& Nbsp; >>> ключове = [key1, dummy_key1, dummy_key2, key2, dummy_key3]
& Nbsp; >>> keys.sort ()
& Nbsp; >>> key_type_ids = [key.key_type_id за ключ в ключове]
& Nbsp; >>> key_type_ids [0: 3] .count ("zope.app.keyreference.object")
& Nbsp; 3
. & Nbsp; >>> key_type_ids [3:] брои ("zope.app.keyreference.persistent")
& Nbsp; 2
Ние ще се съхранява ключовите номерата в базата данни:
& Nbsp; >>> корен ['key1'] = key1
& Nbsp; >>> корен ['key2'] = key2
и използвайте клавишите за съхраняване на обектите отново:
& Nbsp; >>> корен [key1] = корен ['OB1 "]
& Nbsp; >>> корен [key2] = корен ['OB2 "]
& Nbsp; >>> transaction.commit ()
Сега ще се отвори друга връзка:
& Nbsp; >>> conn2 = db.open ()
И провери дали можем да използваме бутоните, за да търсите обекти:
& Nbsp; >>> root2 = conn2.root ()
& Nbsp; >>> key1 = root2 ['key1 "]
& Nbsp; >>> root2 [key1] е root2 ['OB1 "]
& Nbsp; True
& Nbsp; >>> key2 = root2 ['key2 "]
& Nbsp; >>> root2 [key2] е root2 ['OB2 "]
& Nbsp; True
и че ние можем да се обадите на клавишите, за да получите на обектите:
& Nbsp; >>> key1 () е root2 ['OB1 "]
& Nbsp; True
& Nbsp; >>> key2 () е root2 ['OB2 "]
& Nbsp; True
Ние не може да получи основен документ за обект, който все още не е записан:
& Nbsp; >>> KeyReferenceToPersistent (PersistentMapping ())
& Nbsp; ... # doctest: + елипса
& Nbsp; Traceback (последното повикване последната):
& Nbsp; ...
& Nbsp; NotYet: ...
Имайте предвид, че ние получаваме грешка NotYet. Това показва, че ние може да бъде в състояние да получи ключов справка по-късно.
Ние може да получите препратки към незаписани обекти, ако те имат адаптер за ZODB.interfaces.IConnection. Методът за добавяне на връзката ще бъде използвана за получаване на обекта обект ID, което е достатъчно информация, за да се изчисли позоваването. За да видите това, ние ще се създаде обект, който отговаря на IConnection в глупав начин:
& Nbsp; >>> внос персистираща
& Nbsp; >>> от ZODB.interfaces внасят IConnection
& Nbsp; >>> клас C (persistent.Persistent):
& Nbsp; ... Def __conform __ (самостоятелно, iface):
& Nbsp; ... ако iface е IConnection:
& Nbsp; ... завръщане conn2
& Nbsp; >>> OB3 = C ()
& Nbsp; >>> key3 = KeyReferenceToPersistent (OB3)
& Nbsp; >>> transaction.abort ()
<Силен> Разрешаване на конфликти
По време на разрешаването на конфликти, както се обсъжда в ZODB / ConflictResolution.txt, препратки към устойчиви обекти са всъщност копия на ZODB.ConflictResolution.PersistentReference. Това е уместна по два начина за KeyReferenceToPersistent. Първо, той обяснява с финес на класа: тя не наследява от persistent.Persistent. Ако го е направил, че не би било достъпно за разрешаване на конфликти, просто неговата PersistentReference стои-ин.
Второ, това обяснява някои от кода в методите за __hash__ и __cmp__. Тези методи не само обработват persistent.Persistent обекти, но PersistentReference обекти. Без това поведение, предмети, като класическия ZODB BTrees, които използват KeyReferenceToPersistent като ключове или набор членове няма да могат да се решават конфликти. Дори и със специалния код, в някои случаи KeyReferenceToPersistent ще откаже да сравните и хеш време за разрешаване на конфликти, тъй като не може надеждно да го направят.
__hash__ ще работи сравнително рядко по време на разрешаването на конфликти: само за multidatabase препратки. Ето и няколко примера.
& Nbsp; >>> от ZODB.ConflictResolution внос PersistentReference
& Nbsp; >>> Def фабрика (Ref):
& Nbsp; ... ВЕИ = KeyReferenceToPersistent .__ нова __ (
& Nbsp; ... KeyReferenceToPersistent, с реф)
& Nbsp; ... res.object = Реф
& Nbsp; ... Връщане ВЕИ
& Nbsp; ...
& Nbsp; >>> хеш (фабрика (PersistentReference (
& Nbsp; ... ("това старото", "клас метаданни")))) # типичен препратка
& Nbsp; Traceback (последното повикване последната):
& Nbsp; ...
& Nbsp; ValueError: име на база данни налице в момента
& Nbsp; >>> булев (хеш (фабрика (PersistentReference (
& Nbsp; ... ["М", ("база данни", "това старото", "клас метаданни")])))) # multidatabase
& Nbsp; True
Това означава, че KeyReferenceToPersistent често ще възпрепятства разрешаването на конфликти в продължение на часове, като PersistentMapping.
__cmp__ работи, освен ако един обект е multidatabase препратка, а другият не е. Ето няколко примера.
& Nbsp; >>> CMP (фабрика (PersistentReference (
& Nbsp; ... ("това старото", "клас метаданни"))),
& Nbsp; ... фабрика (PersistentReference (
& Nbsp; ... ("това старото", "клас метаданни"))))
& Nbsp; 0
& Nbsp; >>> CMP (фабрика (PersistentReference (
& Nbsp; ... ("това старото", "клас метаданни"))),
& Nbsp; ... фабрика (PersistentReference (
& Nbsp; ... ("друг OID", "клас метаданни"))))
& Nbsp; -1
& Nbsp; >>> CMP (фабрика (PersistentReference ("това старото")),
& Nbsp; ... фабрика (PersistentReference (
& Nbsp; ... ("това старото", "клас метаданни"))))
& Nbsp; 0
& Nbsp; >>> CMP (фабрика (PersistentReference ("това старото")),
& Nbsp; ... фабрика (PersistentReference (
& Nbsp; ... ("това старото", "клас метаданни"))))
& Nbsp; 0
& Nbsp; >>> CMP (фабрика (PersistentReference (
& Nbsp; ... ["М", ("база данни", "това старото", "клас метаданни")])),
& Nbsp; ... фабрика (PersistentReference (
& Nbsp; ... ["М", ("база данни", "това старото", "клас метаданни")])))
& Nbsp; 0
& Nbsp; >>> CMP (фабрика (PersistentReference (
& Nbsp; ... ["М", ("база данни", "това старото", "клас метаданни")])),
& Nbsp; ... фабрика (PersistentReference (
& Nbsp; ... ['N', ("база данни", "това старото")])))
& Nbsp; 0
& Nbsp; >>> CMP (фабрика (PersistentReference (
& Nbsp; ... ["М", ("база данни", "това старото", "клас метаданни")])),
& Nbsp; ... фабрика (PersistentReference (
& Nbsp; ... ["М", ("друга база данни", "това старото", "клас метаданни")])))
& Nbsp; -1
& Nbsp; >>> CMP (фабрика (PersistentReference (
& Nbsp; ... ["М", ("база данни", "това старото", "клас метаданни")])),
& Nbsp; ... фабрика (PersistentReference (
& Nbsp; ... ("това старото", "клас метаданни"))))
& Nbsp; Traceback (последното повикване последната):
& Nbsp; ...
& Nbsp; ValueError: Не може да подреди надеждно
<Силен> Местоположение-базирани връзка адаптер
Zope.keyreference.connectionOfPersistent The функция адаптира обекти за връзки с помощта на проста, базирана на местоположението евристично. Тя проверява, за да се види дали обектът има __parent__, че има връзка:
& Nbsp; >>> от zope.keyreference.persistent внос connectionOfPersistent
& Nbsp; >>> OB3 = PersistentMapping ()
& Nbsp; >>> печат connectionOfPersistent (OB3)
& Nbsp; None
& Nbsp; >>> OB3 .__ parent__ = root2 ['OB1 "]
& Nbsp; >>> connectionOfPersistent (OB3) е conn2
& Nbsp; True

Какво ново в тази версия:

  • Fix тестове разбити от отстраняване на zope.testing от тестови зависимости: избегне модула ZODB3, че тя се нуждае.

<силни> Изисквания :

  • Python

Друг софтуер на разработчика Zope Corporation and Contributors

Коментари към zope.keyreference

Коментари не е намерена
добавите коментар
Включете на изображения!