weak reference callback

larudwer larudwer at freenet.de
Sun Aug 30 05:21:46 EDT 2009


"Paul Pogonyshev" <pogonyshev at gmx.net> schrieb im Newsbeitrag 
news:mailman.658.1251577954.2854.python-list at python.org...
> Hi,
>
> Is weak reference callback called immediately after the referenced
> object is deleted or at arbitrary point in time after that?  I.e. is
> it possible to see a dead reference before the callback is called?
>
> More formally, will this ever raise?
>
>    callback_called = False
>    def note_deletion (ref):
>        callback_called = True
>    ref = weakref.ref (x, note_deletion)
>    if ref () is None and not callback_called:
>        raise RuntimeError ("reference is dead, yet callback hasn't been 
> called yet")

The Manual says:
"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."

This says that the Object is deleted first, and the callback functions will 
be called after that. Since after 'after that'  IS an arbitrary point in 
time your example SHOULD raise.

I think it is save to assume that this will never raise in an single 
threaded cpython application because the GIL and reference counting scheme 
etc. will prevent this.

However, this is an implementation specific detail of the cpython runtime 
and it is not save to rely on this behavior.
It may be completely different in an multi threaded environment or any other 
implementation of Python.












More information about the Python-list mailing list