> Example: > > import os > class RunningFile(object): > filename = '/tmp/running' > def __init__(self): > open(self.filename, 'wb') > def __del__(self): > os.unlink(self.filename) > running_file = RunningFile() > > The deller object is in a cycle as described above [as well as the > Deller class itself].
I think you are mistaken here. The RunningFile instance in above code is *not* part of a cycle. It doesn't have any instance variables (i.e. its __dict__ is empty), and it only refers to its class, which (AFAICT) doesn't refer back to the instance. > When Python exits, it could call > deller.__del__() and then collect the cycle. But Python does the wrong > thing here, and gets rid of the globals before calling __del__: > Exception exceptions.AttributeError: "'NoneType' object has no > attribute 'unlink'" in <bound method RunningFile.__del__ of > <__main__.RunningFile object at 0x7f9655eb92d0>> ignored This is a different issue. For shutdown, Python doesn't rely on cyclic garbage collection (only). Instead, all modules get forcefully cleared, causing this problem. > I believe applying the above enhancement would solve these problems. No, they wouldn't. To work around the real problem in your case, put everything that the destructor uses into an instance or class attribute: class RunningFile(object): filename = '/tmp/running' _unlink = os.unlink def __init__(self): open(self.filename, 'wb') def __del__(self): self._unlink(self.filename) Regards, Martin _______________________________________________ Python-Dev mailing list Python-Dev@python.org http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com