[Python-Dev] Short-circuiting iterators
Matthew F. Barnes
mfb at lotusland.dyndns.org
Wed Dec 7 19:57:36 CET 2005
On Tue, 2005-12-06 at 19:58 -0500, Raymond Hettinger wrote:
> Any real-world use cases or compelling contrived examples?
>
> ISTM, that the code calling it.stop() would already be in position to
> break-out of the iteration directly or set a termination flag. Instead
> of:
>
> it = itertools.interruptable(iterable):
> for x in it:
> . . .
> if cond(x):
> it.stop()
>
> Why not write:
>
> for x in iterable:
> . . .
> if cond(x):
> break
>
> If needed, the for-loop can have an else-clause for any processing
> needed in the event of interruption.
The idea was motivated by a case of nested loops, similar to:
for x in iterable1:
for y in iterable2:
for z in iterable3:
. . .
if cond1(x):
iterable1.stop()
if cond2(y):
iterable2.stop()
if cond3(z):
iterable3.stop()
. . .
It seemed more convenient at the time than having to deal with multiple
termination flags, or breaks, or a combination thereof.
The ability to remotely terminate a for-loop also struck me as somewhat
interesting:
def estimate(item, iterable):
. . .
if good_enough:
iterable.stop()
return result
for x in iterable:
. . .
approx *= estimate(x, iterable)
But these are highly contrived and hardly compelling.
I was primarily interested in whether anyone recalls discussing the
ability to prematurely terminate an iterator and whether there are any
technical drawbacks other than it being redundant.
Matthew Barnes
More information about the Python-Dev
mailing list