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 _______________________________________________ Python-3000 mailing list [email protected] http://mail.python.org/mailman/listinfo/python-3000 Unsubscribe: http://mail.python.org/mailman/options/python-3000/archive%40mail-archive.com
