[Python-ideas] Introduce collections.Reiterable

Andrew Barnert abarnert at yahoo.com
Sat Sep 21 23:17:19 CEST 2013


On Sep 21, 2013, at 13:02, Ryan <rymg19 at gmail.com> wrote:

> The problem with the try...except statement is that it'll catch errors that occur inside the function.
> Say the function calls zip and accidentally gives an int instead of their list. It'll raise a TypeError, which will be caught and a CallbackError will be raised.

You can always use EAFP with a bit of "look back after you leaped" to help diagnose the error:

try:
    self.call[item]()
except TypeError as e:
    if not callable(self.call[item]):
        raise CallbackError(...) from e
    raise

I'm not sure that would be appropriate in this case, but similar code is very common when dealing with, e.g., the filesystem (especially in 2.x, where you had to distinguish errors on errno... but even in 3.x it's often worth telling the user that his error was because the folder be specified doesn't exist, as opposed to just the filename being wrong).

But anyway, I think this is way off topic for this thread. We already have both EAFP and LBYL mechanisms for dealing with iteration; the argument isn't which one you should use, but whether the existing ABCs are sufficient or leave an important gap if you choose to use them for LBYL.

> But, in some programs, that behavior doesn't work.
> 
> "Stephen J. Turnbull" <stephen at xemacs.org> wrote:
>> 
>> Ryan writes:
>> 
>>> I can still see why checking if its callable is a good idea in some
>>> cases.
>> 
>> You can always rewrite the LBYL in EAFP form:
>> 
>> try:
>> self.call[item]()
>> except TypeError as e:
>> raise CallbackError(...) from e
>> 
>> This is definitely preferred if you can enclose a whole suite in a try
>> and expect the CallbackError to be infrequent, eg:
>> 
>> try:
>> while item in input:
>> self.call[item]()
>> except TypeError as e:
>> raise CallbackError(...) from e
>> 
>> However, what you probably really want to do (which is a better
>> argument for LBYL, anyway) is
>> 
>> if callable(callback):
>> self.call[item] = callback
>> else:
>> what_would_jruser_do()
> 
> -- 
> Sent from my Android phone with K-9 Mail. Please excuse my brevity.
> _______________________________________________
> Python-ideas mailing list
> Python-ideas at python.org
> https://mail.python.org/mailman/listinfo/python-ideas
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20130921/63763b10/attachment-0001.html>


More information about the Python-ideas mailing list