Persistent weak key dictionary
This is akin to WeakKeyDictionaries. Note, however, that removal of items is extremely lazy. See below.
We'll start by creating a PersistentWeakKeyDictionary and adding some persistent objects to it.
>>> d = PersistentWeakKeyDictionary()
>>> import ZODB.tests.util
>>> p1 = ZODB.tests.util.P(p1
)
>>> p2 = ZODB.tests.util.P(p2
)
>>> p3 = ZODB.tests.util.P(p3
)
>>> d[p1] = 1
>>> d[p2] = 2
>>> d[p3] = 3
We'll create an extra persistent object that's not in the dict:
>>> p4 = ZODB.tests.util.P(p4
)
Now we'll excercise iteration and item access:
>>> l = [(str(k), d[k], d.get(k)) for k in d]
>>> l.sort()
>>> l
[(P(p1)
, 1, 1), (P(p2)
, 2, 2), (P(p3)
, 3, 3)]
And the containment operator:
>>> [p in d for p in [p1, p2, p3, p4]] [True, True, True, False]
We can add the dict and the referenced objects to a database:
>>> db = ZODB.tests.util.DB()
>>> conn1 = db.open() >>> conn1.root()['p1'] = p1 >>> conn1.root()['d'] = d >>> conn1.root()['p2'] = p2 >>> conn1.root()['p3'] = p3 >>> ZODB.tests.util.commit()
And things still work, as before:
>>> l = [(str(k), d[k], d.get(k)) for k in d]
>>> l.sort()
>>> l
[(P(p1)
, 1, 1), (P(p2)
, 2, 2), (P(p3)
, 3, 3)]
>>> [p in d for p in [p1, p2, p3, p4]]
[True, True, True, False]
Likewise, we can read the objects from another connection and things still work.
>>> conn2 = db.open()
>>> d = conn2.root()['d']
>>> p1 = conn2.root()['p1']
>>> p2 = conn2.root()['p2']
>>> p3 = conn2.root()['p3']
>>> l = [(str(k), d[k], d.get(k)) for k in d]
>>> l.sort()
>>> l
[(P(p1)
, 1, 1), (P(p2)
, 2, 2), (P(p3)
, 3, 3)]
>>> [p in d for p in [p1, p2, p3, p4]]
[True, True, True, False]
Now, we'll delete one of the objects from the database, but not from the dictionary:
>>> del conn2.root()['p2'] >>> ZODB.tests.util.commit()
And pack the database, so that the no-longer referenced p2 is actually removed from the database.
>>> ZODB.tests.util.pack(db)
Now if we access the dictionary in a new connection, it no longer has p2:
>>> conn3 = db.open()
>>> d = conn3.root()['d']
>>> l = [(str(k), d[k], d.get(k)) for k in d]
>>> l.sort()
>>> l
[(P(p1)
, 1, 1), (P(p3)
, 3, 3)]
It's worth nothing that that the versions of the dictionary in conn1 and conn2 still have p2, because p2 is still in the caches for those connections.
Always explicitly close databases: :)
>>> db.close()
There are no attributes in this class.
get(key, default=None)
>>> import ZODB.tests.util >>> key = ZODB.tests.util.P("key") >>> missing = ZODB.tests.util.P("missing") >>> d = PersistentWeakKeyDictionary([(key, 1)]) >>> d.get(key) 1 >>> d.get(missing) >>> d.get(missing, 12) 12
update(adict)