I've thought long and hard and tried to read almost all the mail on this topic, and I cannot get myself to change my mind.
No argument on either side is totally convincing, so I have consulted my language designer's intuition. It tells me that the syntax proposed in the PEP is exactly right - not too hot, not too cold. But, like the Oracle at Delphi in Greek mythology, it doesn't tell me why, so I don't have a rebuttal for the arguments against the PEP syntax. The best I can come up with (apart from agreeing with the rebuttals that Tim and others have already made) is "FUD". If this had been part of the language from day one, I very much doubt it would have made Andrew Kuchling's "Python Warts" page.
So I propose that Tim and others defending 'def' save their remaining breath, and I propose that Paul and others in favor of 'gen[erator]' start diverting their energy towards thinking about how to best teach generators the PEP syntax. Tim, please add a BDFL pronouncement to the PEP to end the argument. You can also summarize the arguments on either side, for posterity -- without trying to counter them.
I found one useful comment on the PEP that isn't addressed and is orthogonal to the whole discussion: try/finally. When you have a try/finally around a yield statement, it is possible that the finally clause is not executed at all when the iterator is never resumed. I find this disturbing, and am tempted to propose that yield inside try/finally be disallowed (but yield inside try/except is still allowed). Another idea might be to somehow continue the frame with an exception at this point -- but I don't have a clue what exception would be appropriate (StopIteration isn't because it goes in the other direction) and I don't know what to do if the generator catches exception and tries to yield again (maybe the exception should be raised again?). The continued execution of the frame would be part of the destructor for the generator-iterator object, so, like a __del__ method, any unhandled exceptions wouldn't be able to propagate out of it.
PS I lost my personal archive of the last 18 hours of the iter mailing list, and the web archive is down, alas, so I'm writing this from memory. I *did* read most of the messages in my archive before I accidentally deleted it, though. ;-)
--Guido van Rossum (home page: http://www.python.org/%7Eguido/)
On Thu, 21 Jun 2001 10:32:40 -0400, Guido van Rossum email@example.com wrote:
Another idea might be to somehow continue the frame with an exception at this point -- but I don't have a clue what exception would be appropriate (StopIteration isn't because it goes in the other direction)
Im sure any exception is appropriate there. What about restarting the frame as if the 'yield' had been followed a 'return'?
Toby Dickenson firstname.lastname@example.org