[Python-Dev] anonymous blocks (don't combine them with generator finalization)

Josiah Carlson jcarlson at uci.edu
Fri Apr 22 02:59:59 CEST 2005

Guido van Rossum <gvanrossum at gmail.com> wrote:
> [Brett]
> > I think I agree with Samuele that it would be more pertinent to put all of this
> > effort into trying to come up with some way to handle cleanup in a generator.
> I.e. PEP 325.
> But (as I explained, and you agree) that still doesn't render PEP 310
> unnecessary, because abusing the for-loop for implied cleanup
> semantics is ugly and expensive, and would change generator semantics;
> and it bugs me that the finally clause's reachability depends on the
> destructor executing.

Yes and no.  PEP 325 offers a method to generators that handles cleanup
if necessary and calls it close().  Obviously calling it close is a
mistake.  Actually, calling it anything is a mistake, and trying to
combine try/finally handling in generators with __exit__/close (inside
or outside of generators) is also a mistake.

Start by saying, "If a non-finalized generator is garbage collected, it
will be finalized."  Whether this be by an exception or forcing a return,
so be it.

If this were to happen, we have generator finalization handled by the
garbage collector, and don't need to translate /any/ for loop.  As long
as the garbage collection requirement is documented, we are covered (yay!).

What about ...


... types of things?  Well, you seem to have offered a syntax ...

[VAR '=']* EXPR:

... which seems to translate into ...

[VAR = ] __var = EXPR

... or something like that.  Great!  We've got a syntax for resource
allocation/freeing outside of generators, and a non-syntax for resource
allocation/freeing inside of generators.

 - Josiah

More information about the Python-Dev mailing list