<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body dir="auto"><div>On Sep 20, 2013, at 21:16, Neil Girdhar <<a href="mailto:mistersheik@gmail.com">mistersheik@gmail.com</a>> wrote:</div><div><br></div><blockquote type="cite"><div><div dir="ltr">You're right that you should go ahead and use something however you want to.  However, there are plenty of times where you can't do that, e.g., you want to know if something is callable before calling it, </div></div></blockquote><div><br></div><div>Why? What's the harm in just calling it and handling the exception? And surely, if you really need to LBYL here, you need to know that it's callable with the argument you plan to pass it. </div><div><br></div><div>There are good uses for checking if something is callable, but this isn't a good example. And it's very different from your other example.</div><br><blockquote type="cite"><div><div dir="ltr">and similarly if something is reiterable before iterating it and exhausting.</div></div></blockquote><div><br></div><div>This one is different. You can't just handle failure, because (a) there's no unambiguous sign of failure, and (b) it's too late to deal with it if you've already exhausted the iterator. </div><div><br></div><div>However, if you just turn the test around, it _is_ syntactically checkable: if "isinstance(it, Iterator)", or "iter(it) is it" or "hasattr(it, __next__)" or "next(it)" doesn't raise... then you have to do a single-pass algorithm or tee the values or make a list or whatever.</div><div><br></div><div>Either Reiterable is just Iterable and not Iterator (barring any flaws in the definition of Iterable, which is a separate problem), or it's not an abstract type.</div><div><br></div><div>And if it's just Iterable and not Iterator, besides being complicated to implement (you can't inherit from the negation of a class), it's also more complicated to use. The obvious use case is: If you get an Iterator, you have to tee, make a list, use a one-pass algorithm instead of two-pass, whatever. Rewriting that instead as if you get an Iterable but it's not a Reiterable buys you nothing but verbosity. Turning it around so if you get a Reiterable you can skip the fallback just means a double negative that's harder to process.</div><div><br></div><blockquote type="cite"><div><div dir="ltr">  That is the purpose of collections.abc, and that's what I thought we were discussing.  Could you make mistakes trying to look ahead like this?  Sure.  An object could appear callable only to raise NotImplementedError on calling it.  Looking ahead does not have to be foolproof.  This is Python, and of course (almost) *any test* can be fooled.  That doesn't just go for reiterability, it goes for callability as well.<div>

<br></div><div>Best,</div><div>Neil</div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Sat, Sep 21, 2013 at 12:09 AM, 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:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="im">On Sat, Sep 21, 2013 at 12:00:14AM -0400, Neil Girdhar wrote:<br>
> If someone allows their class to fail the standardized test for<br>
> Iterable/Reiterable/Sequence, that class doesn't deserve to be treated as<br>
> one.  (Anyone can register their class as a subclass of the ABCs, or more<br>
> simply inherit from one.)<br>
<br>
</div>This is Python, and duck-typing rules, not Java-like type checking. If<br>
you want a language with strict type checking designed by theorists, try<br>
Haskell.<br>
<br>
The ultimate test in Python of whether something is iterable or not is<br>
to try iterating over it, and see if it succeeds or not. If it iterates<br>
like a duck, that's good enough to be treated as a duck.<br>
<span class="HOEnZb"><font color="#888888"><br>
<br>
--<br>
Steven<br>
</font></span><div class="HOEnZb"><div class="h5">_______________________________________________<br>
Python-ideas mailing list<br>
<a href="mailto:Python-ideas@python.org">Python-ideas@python.org</a><br>
<a href="https://mail.python.org/mailman/listinfo/python-ideas" target="_blank">https://mail.python.org/mailman/listinfo/python-ideas</a><br>
<br>
--<br>
<br>
---<br>
You received this message because you are subscribed to a topic in the Google Groups "python-ideas" group.<br>
To unsubscribe from this topic, visit <a href="https://groups.google.com/d/topic/python-ideas/OumiLGDwRWA/unsubscribe" target="_blank">https://groups.google.com/d/topic/python-ideas/OumiLGDwRWA/unsubscribe</a>.<br>
To unsubscribe from this group and all its topics, send an email to <a href="mailto:python-ideas%2Bunsubscribe@googlegroups.com">python-ideas+unsubscribe@googlegroups.com</a>.<br>
For more options, visit <a href="https://groups.google.com/groups/opt_out" target="_blank">https://groups.google.com/groups/opt_out</a>.<br>
</div></div></blockquote></div><br></div>
</div></blockquote><blockquote type="cite"><div><span>_______________________________________________</span><br><span>Python-ideas mailing list</span><br><span><a href="mailto:Python-ideas@python.org">Python-ideas@python.org</a></span><br><span><a href="https://mail.python.org/mailman/listinfo/python-ideas">https://mail.python.org/mailman/listinfo/python-ideas</a></span><br></div></blockquote></body></html>