[Python-Dev] (try-except) conditional expression similar to (if-else) conditional (PEP 308)

Eric Pruitt eric.pruitt at gmail.com
Thu Aug 6 15:39:59 CEST 2009


What about catching specific error numbers? Maybe an option so that
the dictionary elements can also be dictionaries with integers as the
keys:

    filedata = try_3(open, randomfile, except = { IOError,  {2: None} } )

If it isn't found in the dictionary, then we raise the error.

On Thu, Aug 6, 2009 at 07:03, ilya<ilya.nikokoshev at gmail.com> wrote:
> I took a look at the options 1 and 2:
>
>    x = float(string) except float('nan') if ValueError
>    y = float(string) except ValueError: float('nan')
>
> and I think this can be done just as easily with existing syntax:
>
>    x = try_1(float, string, except_ = float('nan'), if_ = ValueError)
>    y = try_2(float, string, { ValueError: float('nan') })
>
> Here's the full example:
>
> ----- example starts -----
>
> def try_1(func, *args, except_ = None, if_ = None):
>    try:
>        return func(*args)
>    except if_ as e:
>        return except_
>
> def try_2(func, *args):
>    'The last argument is a dictionary {exception type: return value}.'
>    dic = args[-1]
>    try:
>        return func(*args[:-1])
>    except Exception as e:
>        for k,v in dic.items():
>            if isinstance(e, k):
>                return v
>        raise
>
> for string in ['5', 'five']:
>    #   x = float(string) except float('nan') if ValueError
>    x = try_1(float, string, except_ = float('nan'), if_ = ValueError)
>    #   y = float(string) except ValueError: float('nan')
>    y = try_2(float, string, { ValueError: float('nan') })
>    print(x, y)
>
> ----- example ends -----
>
> As a side note, if I just subscribed to python-dev, is it possible to
> quote an old email? Below is my manual cut-and-paste quote:
>
> ---------- my quote --------------
>
> Nick Coghlan wrote:
>> P.J. Eby wrote:
>>> At 05:59 PM 8/5/2009 -0700, Raymond Hettinger wrote:
>>>> [Jeffrey E. McAninch, PhD]
>>>>> I very often want something like a try-except conditional expression
>>>>> similar
>>>>> to the if-else conditional.
>>>>>
>>>>> An example of the proposed syntax might be:
>>>>>    x = float(string) except float('nan')
>>>>> or possibly
>>>>>    x = float(string) except ValueError float('nan')
>>>> +1 I've long wanted something like this.
>>>> One possible spelling is:
>>>>
>>>>   x = float(string) except ValueError else float('nan')
>>> I think 'as' would be better than 'else', since 'else' has a different
>>> meaning in try/except statements, e.g.:
>>>
>>>    x = float(string) except ValueError, TypeError as float('nan')
>>>
>>> Of course, this is a different meaning of 'as', too, but it's not "as"
>>> contradictory, IMO...  ;-)
>>
>> (We're probably well into python-ideas territory at this point, but I'll
>> keep things where the thread started for now)
>>
>> The basic idea appears sound to me as well. I suspect finding an
>> acceptable syntax is going to be the sticking point.
>>
>> Breaking the problem down, we have three things we want to separate:
>>
>> 1. The expression that may raise the exception
>> 2. The expression defining the exceptions to be caught
>> 3. The expression to be used if the exception actually is caught
>>
>>>From there it is possible to come up with all sorts of variants.
>>
>> Option 1:
>>
>> Change the relative order of the clauses by putting the exception
>> definition last:
>>
>>   x = float(string) except float('nan') if ValueError
>>   op(float(string) except float('nan') if ValueError)
>>
>> I actually like this one (that's why I listed it first). It gets the
>> clauses out of order relative to the statement, but the meaning still
>> seems pretty obvious to me.
>>
> A further extension (if we need it):
>
>     result = foo(arg) except float('inf') if ZeroDivisionError else
> float('nan')
>
> The 'else' part handles any other exceptions (not necessarily a good idea!).
>
> or:
>
>     result = foo(arg) except float('inf') if ZeroDivisionError else
> float('nan') if ValueError
>
> Handles a number of different exceptions.
>
>> Option 2:
>>
>> Follow the lamba model and allow a colon inside this form of expression:
>>
>>   x = float(string) except ValueError: float('nan')
>>   op(float(string) except ValueError: float('nan'))
>>
>> This has the virtue of closely matching the statement syntax, but
>> embedding colons inside expressions is somewhat ugly. Yes, lambda
>> already does it, but lambda can hardly be put forward as a paragon of
>> beauty.
>>
> A colon is also used in a dict literal.
>
>> Option 3a/3b:
>>
>> Raymond's except-else suggestion:
>>
>>   x = float(string) except ValueError else float('nan')
>>   op(float(string) except ValueError else float('nan'))
>>
> [snip]
> -1
> _______________________________________________
> Python-Dev mailing list
> Python-Dev at python.org
> http://mail.python.org/mailman/listinfo/python-dev
> Unsubscribe: http://mail.python.org/mailman/options/python-dev/eric.pruitt%40gmail.com
>


More information about the Python-Dev mailing list