[Python-3000] Removing __del__
Giovanni Bajo
rasky at develer.com
Wed Sep 20 15:36:48 CEST 2006
Jean-Paul Calderone 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.
Thanks for the example.
Thus, I believe my example is a good use case for __del__ with no good
enough workaround, which was requested by Micheal in the original post. I
believe that it would be a mistake to remove __del__ unless we provide a
graceful alternative (and I don't consider the code above a graceful
alternative). I still like the __close__ method being proposed. I'd love to
see a PEP for it.
--
Giovanni Bajo
More information about the Python-3000
mailing list