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

Steven D'Aprano steve at pearwood.info
Tue Aug 11 01:45:58 CEST 2009

On Tue, 11 Aug 2009 12:29:32 am Dj Gilcrease wrote:
> I figure I would write up the PEP draft, I have never tried writing a
> pep before, but i did read PEP 1 and tried to follow it's formating
> guides. If there are no additions to the idea, then it seems there
> just needs to be a consensus on the syntax before submitting it to
> the peps list

Shouldn't there be consensus on whether or not this is a good idea 


> Modivation


>    Often when doing calculations or string recasting (to int, float,
>    etc) it is required to wrap the section in a simple try-except
>    where the exception just assigns a default value. It would be more
>    readable and consise if these type of try-excepts could be written
>    on a single line.

Concise (note spelling) certainly, but I question that it would be more 
readable. Newlines are not a bad thing, but trying to squeeze too much 
into a single line is.

When the `x if y else z` expression was first introduced, I was very 
excited because I thought it would be very useful. But I soon found 
that it actually wasn't that useful to me: it was rare that I wanted 
it, and when I did, it was usually more readable to use an `if` block 
instead. So I don't find this proposal the least bit compelling. It 
seems to me to be primarily useful for saving wear and tear on the 
Enter key.

> Syntax Ideas:
>    Option 1:
>        x = float(string) except float('nan') if ValueError
>        op(float(string) except float('nan') if ValueError)

Looks too confusingly like an if test. I find my eye drawn to the final 
clause, `if ValueError`, and expecting that to evaluate to true.


>    Option 2:
>        x = float(string) except ValueError: float('nan')
>        op(float(string) except ValueError: float('nan'))

At the risk of an extra keyword, I would prefer `unless` instead of 

I find this the least worst of the alternatives. 


>    Option 3:
>        x = float(string) except ValueError else float('nan')
>        op(float(string) except ValueError else float('nan'))

Also looks confusingly like an if test, but not as strongly as Option 1.


Should the PEP allow expressions like this?

    func(obj) except str(e) if ValueError as e  # Option 1
    func(obj) except ValueError as e: str(e)  # Option 2
    func(obj) except ValueError as e else str(e)  # Option 3

Justify your choice please.

Steven D'Aprano

More information about the Python-Dev mailing list