[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 
first?

[...]


> Modivation

Motivation.

>    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.

-1


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

[bike-shedding]
At the risk of an extra keyword, I would prefer `unless` instead of 
`except`.
[/bike-shedding]

I find this the least worst of the alternatives. 

-0


>    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.

-0.5


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