Amaury Forgeot d'Arc <[email protected]> added the comment:
Normally you should never call __del__, OTOH the issue is the same with a class
like::
class A:
def close(self):
self.close()
def __del__(self):
self.close()
The problem is not with _infinite_ recursion, though; a depth of 47 is enough
(but 46 won't show the problem)::
class A:
def __del__(self):
self.recurse(47)
def recurse(self, n):
if n:
self.recurse(n-1)
else:
raise ValueError
Hint: PyTrash_UNWIND_LEVEL is defined to 50; I checked that recompiling Python
with a different value also changes the necessary recursion depth.
There is some nasty interaction between the "Trashcan mechanism" and
resurrected objects stored in deep structures. A list is enough, no need to
involve frames and exceptions::
class C:
def __del__(self):
print ".",
x = self
for i in range(49): # PyTrash_UNWIND_LEVEL-1
x = [x]
l = [C()]
del l
----------
nosy: +amaury.forgeotdarc
_______________________________________
Python tracker <[email protected]>
<http://bugs.python.org/issue10794>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com