[Python-3000] Removing __del__
Jean-Paul Calderone
exarkun at divmod.com
Wed Sep 20 00:40:48 CEST 2006
On Tue, 19 Sep 2006 23:42:43 +0200, Giovanni Bajo <rasky at develer.com> wrote:
>Michael Chermside <mcherm at mcherm.com> wrote:
>
>> Since we're apparently still in "propose wild ideas" mode for Py3K
>> I'd like to propose that for Py3K we remove __del__. Not "fix" it,
>> not "tweak" it, just remove it and perhaps add a note in the manual
>> pointing people to the weakref module.
>
>
>I don't use __del__ much. I use it only in leaf classes, where it surely can't
>be part of loops. In those rare cases, it's very useful to me. For instance, I
>have a small classes which wraps an existing handle-based C API exported to
>Python. Something along the lines of:
>
>class Wrapper:
> def __init__(self, *args):
> self.handle = CAPI.init(*args)
>
> def __del__(self, *args):
> CAPI.close(self.handle)
>
> def foo(self):
> CAPI.foo(self.handle)
>
>The real class isn't much longer than this (really). How do you propose to
>write this same code without __del__?
Untested, but roughly:
_weakrefs = []
def _cleanup(ref, handle):
_weakrefs.remove(ref)
CAPI.close(handle)
class BetterWrapper:
def __init__(self, *args):
handle = self.handle = CAPI.init(*args)
_weakrefs.append(
weakref.ref(self,
lambda ref: _cleanup(ref, handle)))
def foo(self):
CAPI.foo(self.handle)
There are probably even better ways too, this is just the first that comes
to mind.
Jean-Paul
More information about the Python-3000
mailing list