[Python-Dev] pre-PEP: Resource-Release Support for
Generators
Samuele Pedroni
pedronis at bluewin.ch
Wed Aug 27 00:20:43 EDT 2003
At 13:50 26.08.2003 -0700, Guido van Rossum wrote:
>The spec needs to define clearly what should happen if the generator
>catches and ignores the exception, e.g.:
>
> def forever():
> while True:
> try:
> yield None
> except:
> pass
>
> f = forever()
> f.next()
> f.close()
>
>Clearly at this point the generator reaches the yield again. What
>should happen then? Should it suspend so that a subsequent call to
>f.next() can receive another value? Or should reaching yield after
>the generator is closed raise another exception? I'm leaning towards
>the latter, despite the fact that it will cause an infinite loop in
>this case -- that's no different when you have a print statement
>instead of a yield statement.
>
also
try:
...
yield
...
except: # or except Exception
raise a new different exception
is not a clear-cut situation. close should probably propagate exceptions
different from
CloseGenerator but here the right thing to do is fuzzy.
It also another case of the problems of too broad-catching except clauses,
in some sense the exception generated by close is like an async exception like
KeyboardInterrupt.
>Another comment on Samuele's PEP: It is sort of sad that the *user* of
>a generator has to know that the generator's close() must be called.
>Normally, the beauty of using a try/finally for cleanup is that your
>callers don't need to know about it. But I see no way around this.
>And this is still an argument that pleads against the whole thing,
>either PEP 288 or Samuele's smaller variant: the usual near-guarantee
>that code in a finally clause will be executed no matter what (barring
>fatal errors, os._exit() or os.execv()) does not apply. And this was
>the original argument against allowing yield inside try/finally. But
>the need for cleanup is also clear, so I like Samuele's KISS compromise.
yes, we cannot totally win.
More information about the Python-Dev
mailing list