
On Tue, 30 Dec 2014 19:22:36 -0500 Kevin Norris <nykevin.norris@gmail.com> wrote:
Let's talk about weakref.WeakKeyDictionary.
First, what is it? It's a dictionary whose keys are referenced weakly. That is, the dictionary takes weak references to its keys. If a key is garbage collected, it magically vanishes from the dictionary. This saves programmers much of the trouble of manually culling dead weak references from data structures.
Why would you use it? The official documentation mentions implementing a [descriptor][1]. See [this paste][2] for a simple example of this sort of thing.
How about something like this (untested): import weakref class Foo: def __init__(self): self._data = {} def __get__(self, obj, owner): _, val = self._data[id(obj)] return val def __set__(self, obj, value): key = id(obj) try: ref, _ = self._data[key] except KeyError: def on_destroy(_): del self._data[key] ref = weakref.ref(obj, on_destroy) self._data[key] = ref, value def __delete__(self, obj): del self._data[id(obj)] class Bar: foo = Foo() Regards Antoine.