Class
persistent.wref.PersistentWeakKeyDictionary

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()

Base classes

Implemented Interfaces

Attributes/Properties

There are no attributes in this class.

Methods

Known Subclasses