Issue 15412: Note in documentation for weakrefs (original) (raw)

Created on 2012-07-21 09:41 by sbt, last changed 2022-04-11 14:57 by admin. This issue is now closed.

Messages (5)
msg166002 - (view) Author: Richard Oudkerk (sbt) * (Python committer) Date: 2012-07-21 09:41
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)
msg166006 - (view) Author: Antoine Pitrou (pitrou) * (Python committer) Date: 2012-07-21 10:23
> 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).
msg166009 - (view) Author: Richard Oudkerk (sbt) * (Python committer) Date: 2012-07-21 10:58
> 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.
msg166010 - (view) Author: Antoine Pitrou (pitrou) * (Python committer) Date: 2012-07-21 10:59
> 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 :-)).
msg168446 - (view) Author: Roundup Robot (python-dev) (Python triager) Date: 2012-08-17 14:06
New changeset 78b0f294674c by Richard Oudkerk in branch '2.7': Issue #15412: Remove erroneous note about weakrefs http://hg.python.org/cpython/rev/78b0f294674c New changeset 24b13be81d61 by Richard Oudkerk in branch '3.2': Issue #15412: Remove erroneous note about weakrefs http://hg.python.org/cpython/rev/24b13be81d61
History
Date User Action Args
2022-04-11 14:57:33 admin set github: 59617
2012-08-17 14:08:30 sbt set status: open -> closedresolution: fixedstage: resolved
2012-08-17 14:06:49 python-dev set nosy: + python-devmessages: +
2012-07-21 10:59:29 pitrou set messages: +
2012-07-21 10:58:21 sbt set messages: +
2012-07-21 10:23:52 pitrou set messages: +
2012-07-21 09:41:57 sbt create