On Tue, Oct 17, 2017 at 2:46 PM, Serhiy Storchaka <storchaka@gmail.com> wrote:
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.

​Just to note that there is currently nothing that would prevent making `for x in y in z`​ a syntax error. There is nothing meaningful that it could do, really, because y in z can only return True or False (or raise an Exception or loop infinitely).

But for an infinite iterable, the right answer may be Maybe ;)

​––Koos​

 
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__.


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



--
+ Koos Zevenhoven + http://twitter.com/k7hoven +