[Python-ideas] Membership of infinite iterators

Serhiy Storchaka storchaka at gmail.com
Tue Oct 17 07:46:38 EDT 2017


17.10.17 14:10, Nick Coghlan пише:
> 1. It's pretty easy to write "for x in y in y" when you really meant to 
> write "for x in y", and if "y" is an infinite iterator, the "y in y" 
> part will become an unbreakable infinite loop when executed instead of 
> the breakable one you intended (especially annoying if it means you have 
> to discard and restart a REPL session due to it, and that's exactly 
> where that kind of typo is going to be easiest to make)

I think it is better to left this on linters. I never encountered this 
mistake and doubt it is common. In any case the first execution of this 
code will expose the mistake.

> 2. Containment testing already has a dedicated protocol so containers 
> can implement optimised containment tests, which means it's also trivial 
> for an infinite iterator to intercept and explicitly disallow 
> containment checks if it chooses to do so

But this has non-zero maintaining cost. As the one who made many changes 
in itertools.c I don't like the idea of increasing its complexity for 
optimizing a pretty rare case.

And note that the comparison can have side effect. You can implement the 
optimization of `x in count()` only for the limited set of builtin 
types. For example `x in range()` is optimized only for exact int and 
bool. You can't guarantee the finite time for cycle() and repeat() 
either since they can emit values of arbitrary types, with arbitrary __eq__.



More information about the Python-ideas mailing list