classification
Title: Note in documentation for weakrefs
Type: Stage: resolved
Components: Documentation Versions:
process
Status: closed Resolution: fixed
Dependencies: Superseder:
Assigned To: docs@python Nosy List: docs@python, pitrou, python-dev, sbt
Priority: normal Keywords:

Created on 2012-07-21 09:41 by sbt, last changed 2012-08-17 14:08 by sbt. 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
2012-08-17 14:08:30sbtsetstatus: open -> closed
resolution: fixed
stage: resolved
2012-08-17 14:06:49python-devsetnosy: + python-dev
messages: + msg168446
2012-07-21 10:59:29pitrousetmessages: + msg166010
2012-07-21 10:58:21sbtsetmessages: + msg166009
2012-07-21 10:23:52pitrousetmessages: + msg166006
2012-07-21 09:41:57sbtcreate