On 4/16/2019 4:54 PM, Stefano Borini wrote:
given the following code

def g():
     yield 2
     yield 3
     return 6

for x in g():
     print(x)

The output is obviously
2
3

As far as I know, there is currently no way to capture the
StopIteration value when the generator is used in a for loop. Is it
true?
If not, would a syntax like:

for x in g() return v:
     print(x)

print(v) # prints 6

be useful? It would be syntactic sugar for (corner cases omitted)

Syntactic sugar should be reserved for fairly common cases, not for extremely rare cases.

def g():
     yield 2
     yield 3
     return 6

If a for loop user needs to see 6, it should be yielded.

Adding non-None return values to StopIteration is fairly new, and was/is intended for cases where a generator is not being used as a simple forward iterator. For such special cases, special code like the following should be used.

it = iter(g())
while True:
     try:
         x = next(it)
     except StopIteration as exc:
         v = exc.value
         break
     else:
         print(x)
print(v)





--
Terry Jan Reedy

_______________________________________________
Python-ideas mailing list
[email protected]
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to