On 11/18/2014 05:50 AM, Guido van Rossum wrote:
Separate from this special case, I am also worried about backward compatibility, and I have yet to get a good idea for how widespread code is that depends on StopIteration bubbling out from generators. I also don't have a good idea how often this issue bites users, but I have a feeling it does bite. E.g. this quote from c.l.py http://c.l.py (https://mail.python.org/pipermail/python-list/2014-November/680775.html):
""" I did find it annoying occasionally that raising StopIteration inside a generator expression conveys a different behavior than elsewhere. It did take me quite a while to understand why that is so, but after that it did not cause me much of a headache anymore. """
I just remembered one use of the current behavior. Two years ago or so, I was suggesting on this list a possibility for early termination of comprehensions when a particular value is encountered. In other words, an equivalent to:
l =  for x in seq: if x == y: break l.append(x)
At the time, somebody suggested (roughly):
def stop(): raise StopIteration
l = list(x for x in seq if x!=y or stop())
which, for the very reasons discussed in this thread, works only as a generator expression and not in comprehension form.
I used this solution in some not particularly important piece of code so I wouldn't despair if it wasn't compatible with the next release of the language. Also, I have a feeling that some of you may consider this sort of a hack in the first place. Just thought I'd mention it here for completeness.