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

Dino Viehland dinov at microsoft.com
Thu Aug 6 23:55:47 CEST 2009

On option 1 is this legal then?

x = float(string) except float('nan') if some_check() else float('inf') if ValueError

-----Original Message-----
From: python-dev-bounces+dinov=microsoft.com at python.org [mailto:python-dev-bounces+dinov=microsoft.com at python.org] On Behalf Of Nick Coghlan
Sent: Thursday, August 06, 2009 3:48 AM
To: P.J. Eby
Cc: python-dev at python.org; Jeff McAninch
Subject: Re: [Python-Dev] (try-except) conditional expression similar to (if-else) conditional (PEP 308)

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.

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.

Option 3a/3b:

Raymond's except-else suggestion:

  x = float(string) except ValueError else float('nan')
  op(float(string) except ValueError else float('nan'))

This has the problem of inverting the sense of the else clause relative to the statement form (where the else clause is executed only if no exception occurs)

A couple of extra keywords would get the sense correct again, but I'm not sure the parser could cope with it and it is rather verbose (I much prefer option 1 to this idea):

  x = float(string) if not except ValueError else float('nan')
  op(float(string) if not except ValueError else float('nan'))

Option 4:

PJE's except-as suggestion:

  x = float(string) except ValueError as float('nan')
  op(float(string) except ValueError as float('nan'))

Given that we now use "except ValueError as ex" in exception statements, the above strikes me a really confusing idea.


Nick Coghlan   |   ncoghlan at gmail.com   |   Brisbane, Australia
Python-Dev mailing list
Python-Dev at python.org
Unsubscribe: http://mail.python.org/mailman/options/python-dev/dinov%40microsoft.com

More information about the Python-Dev mailing list