[Python-3000] Removing __del__

Jim Jewett jimjjewett at gmail.com
Tue Sep 26 15:30:01 CEST 2006


On 9/26/06, Tim Peters <tim.peters at gmail.com> wrote:
> [Giovanni Bajo]
> > You say that __del__ is harardous, but I can't see how
> > weakrefs are less hazardous. As an implicit finalization method, they live on
> > the fragile assumption that the callback won't hold a reference to the object:

> Nope, not so.

I think you read "live" as "not trash", but in this particular
sentence, he meant it as "be useful".

> Read Modules/gc_weakref.txt for the gory details.  In
> outline, there are three objects of interest here:  the weakly
> referenced object (WO), the weakref (WR) to the WO, and the callback
> (CB) callable attached to the WR.

> /Normally/ the CB is reachable (== not trash).

(Otherwise it can't act as a finalizer, because it isn't around)

> If a reachable CB has
> a strong reference to the WO, then that keeps the WO reachable too,

So it doesn't act as a finalizer; it acts as an immortalizer.  All the
pain of __del__, and it takes only one to make a loop.  (Bound methods
are in this category.)

> OTOH, if the CB has a weak reference to the WO, then when the WO goes
> away and the CB is invoked, the CB's weak reference returns None
> instead of the WO.

So it still can't act as a proper finalizer, if only because it isn't
fast enough.

-jJ


More information about the Python-3000 mailing list