[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