Greg Ewing wrote:
Antoine Pitrou wrote:
The problem I can see is that in normal
iteration forms (e.g. a
"for" loop), the argument to StopIteration is ignored. Therefore, a generator
executing such a return statement and expecting the caller to use the return value
wouldn't be usable in normal iteration contexts.
How is this different from an ordinary function returning a value that is ignored by the caller?
It's up to the caller to decide whether to use the return value. If it wants the return value, then it has to either use a 'yield from' or catch the StopIteration itself and extract the value.
I think there is a difference. I were to
def my_gen(): ... yield 1 ... return 2 #or "return finally 2" or whatever
I would would be very surprised at the result when putting it into
for i in my_gen(): ... print(i) ... 1
Where did the two go? Why did it disappear? Well, the answer is
the for-loop body ignored it, the same way the None emitted by a
mutating function gets ignored. But that answer doesn't seem very
compelling to me, just confusing.
-1 for returning from a generator.