In the documentation on weakrefs there is the following quote Note: Weak references to an object are cleared before the object’s __del__() is called, to ensure that the weak reference callback (if any) finds the object still alive. But I think the weakref is always dead by the time the callback is invoked. The first paragraph from the documentation for weakref.ref(object[, callback]) contains the following: If callback is provided and not None, and the returned weakref object is still alive, the callback will be called when the object is about to be finalized; the weak reference object will be passed as the only parameter to the callback; **the referent will no longer be available**. Which does prompt a question: what use is there for the weakref argument to the callback if it already dead? (Compare http://bugs.python.org/issue14933)
> In the documentation on weakrefs there is the following quote > > Note: Weak references to an object are cleared before the object’s > __del__() is called, to ensure that the weak reference callback > (if any) finds the object still alive. > > But I think the weakref is always dead by the time the callback is > invoked. It's true, the doc needs fixing. > Which does prompt a question: what use is there for the weakref > argument to the callback if it already dead? The weakref is "dead" but it's still a weakref, and it can be used to e.g. index a container of existing weakrefs (cf. WeakSet, WeakKeyDictionary, WeakValueDictionary).
> The weakref is "dead" but it's still a weakref, and it can be used to > e.g. index a container of existing weakrefs (cf. WeakSet, > WeakKeyDictionary, WeakValueDictionary). Ah. I had assumed that since dead weakrefs were unhashable you couldn't safely use them as keys in a dict. (Presumably removal of a no longer hashable key from a dict is O(n)?) I also hadn't realize that weakrefs were subclassable.
> I had assumed that since dead weakrefs were unhashable you couldn't > safely use them as keys in a dict. (Presumably removal of a no longer > hashable key from a dict is O(n)?) They are unhashable if you didn't hash them alive. Otherwise they retain their old hash value (which is quite useful :-)).