On Tue, 17 Apr 2012 17:22:57 +0000
Kristján Valur Jónsson <kristjan@ccpgames.com> wrote:
> >
> > We are all consenting adults. Everything is allowed - you just have to live with
> > the consequences.
>
> Well, we specifically decided that objects with __del__ methods that are part of a cycle cannot be run.
> The same reasoning was applied to generators, if they are in a certain state.
> What makes iobase so special that its 'close' method can be run even if it is part of a cycle?

The reason is that making file objects uncollectable when they are part
of a reference cycle would be a PITA and a serious regression for many
applications, I think.

> Why not allow it for all objects, then?

I'm not the author of the original GC design. Perhaps it was
deliberately conservative at the time? I think PyPy has a more tolerant
solution for finalizers in reference cycles, perhaps they can explain it
here.

Regards

Antoine.

PyPy breaks cycles randomly. I think a pretty comprehensive description of what happens is here:

http://morepypy.blogspot.com/2008/02/python-finalizers-semantics-part-1.html
">

(original) (raw)

On Tue, Apr 17, 2012 at 8:30 PM, Antoine Pitrou <solipsis@pitrou.net> wrote:

On Tue, 17 Apr 2012 17:22:57 +0000
Kristján Valur Jónsson <kristjan@ccpgames.com> wrote:
> >
> > We are all consenting adults. Everything is allowed - you just have to live with
> > the consequences.
>
> Well, we specifically decided that objects with \_\_del\_\_ methods that are part of a cycle cannot be run.
> The same reasoning was applied to generators, if they are in a certain state.
> What makes iobase so special that its 'close' method can be run even if it is part of a cycle?

The reason is that making file objects uncollectable when they are part
of a reference cycle would be a PITA and a serious regression for many
applications, I think.

> Why not allow it for all objects, then?

I'm not the author of the original GC design. Perhaps it was
deliberately conservative at the time? I think PyPy has a more tolerant
solution for finalizers in reference cycles, perhaps they can explain it
here.

Regards

Antoine.

PyPy breaks cycles randomly. I think a pretty comprehensive description of what happens is here:


Cheers,
fijal