<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On 17 October 2017 at 17:44, Steven D'Aprano <span dir="ltr"><<a href="mailto:steve@pearwood.info" target="_blank">steve@pearwood.info</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span class="gmail-">On Tue, Oct 17, 2017 at 04:42:35PM +1000, Nick Coghlan wrote:<br>
<br>
> I should also note that there's another option here beyond just returning<br>
> "False": it would also be reasonable to raise an exception like<br>
> "RuntimeError('Attempted negative containment check on infinite iterator')".<br>
<br>
</span>I don't think that works, even if we limit discussion to just<br>
itertools.count() rather than arbitrary iterators. Obviously we<br>
cannot wait until the entire infinite iterator is checked (that<br>
might take longer than is acceptible...) but if you only check a<br>
*finite* number before giving up, you lead to false-negatives:<br>
<br>
# say we only check 100 values before raising<br>
0 in itertools.count(1)  # correctly raises<br>
101 in itertools.count(1)  # wrongly raises<br></blockquote><div><br></div><div>Nobody suggested that, as it's obviously wrong. This discussion is solely about infinite iterators that have closed form containment tests, either because they're computed (itertools.count()), or because they're based on an underlying finite sequence of values (cycle(), repeat()).<br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">

If we do a computed membership test, then why raise at all? We quickly<br>
know whether or not the value is in the sequence, so there's no error to<br>
report.<br></blockquote><div><br></div></div><div class="gmail_quote">Because we should probably always be raising for these particular containment checks, and it's safe to start doing so in the negative case, since that's currently a guaranteed infinite loop.</div><div class="gmail_quote"><br></div><div class="gmail_quote">And unlike a "while True" loop (which has many real world applications), none of these implicit infinite loops allow for any kind
 of useful work on each iteration, they just end up in a tight loop 
deep inside the interpreter internals, doing absolutely nothing. They won't 
even check for signals or release the GIL, so you'll need to ask the operating system to clobber the entire process to break out of it - Ctrl-C will be ignored.</div><div class="gmail_quote"><br></div><div class="gmail_quote">I'd also have no major objection to deprecating containment tests on these iterators entirely, but that doesn't offer the same kind of UX benefit that replacing an infinite loop with an immediate exception does, so I think the two questions should be considered separately. <br></div><div class="gmail_quote"><br></div><div class="gmail_quote">Cheers,</div><div class="gmail_quote">Nick.<br clear="all"></div><br>-- <br><div class="gmail_signature">Nick Coghlan   |   <a href="mailto:ncoghlan@gmail.com" target="_blank">ncoghlan@gmail.com</a>   |   Brisbane, Australia</div>
</div></div>