[Python-Dev] Adding a conditional expression in Py3.0

Terry Reedy tjreedy at udel.edu
Sat Sep 24 04:19:48 CEST 2005


"Jim Jewett" <jimjjewett at gmail.com> wrote in message 
news:fb6fbf5605092112145cfda669 at mail.gmail.com...

A nice summary, to which I will add just a little.

> For a conditional expression, I think the choices are really down
> to the following, which was already way too much freedom last
> (http://www.python.org/peps/pep-0308.html) time:
>
> (1)  Should it be done at all?
>    +  It would be useful, and avoid certain types of bugs.
>    -  It would encourage bracketing instead of indentation
>
> PEP 308 decided "not yet, anyhow"
>
> (2)  How many of the keywords (if ... then ... else ... elif) should be 
> dropped?
>    (if test then True else False)
>        + standard english
>        + standard programming idiom
>        - adds a "then" keyword
>    (if test True else False)
>        + better parallels the if: statement
>        - starts to run together

I think the first form with 'then' better parallels the 'if <cond> :' 
statement because 'then' functions as a separator between test and True 
just as ':' or ':\n' functions as a separator between <cond> and <True 
body>.

>    (if test1 Val1 elif test2 Val2 elif test3 Val3)
>        + parallels the if: statement
>        - encourages overly long code
>        * but still better than nested parens
>
> PEP 308 wasn't entirely clear; the words said to keep "elif", but
> the examples did not.  There was some disagreement on which
> of the other three keywords to represent explicitly.  (Rather than
> only by position.)
>
> (3)  What order should the clauses appear?
>    (if test then True else False)
>    (if test1 then Val1 elif test2 Val2 elif test3 Val3 else Val4)
>        + Natural Order
>        - do we need "then"?
>    (True if normal else False)
>    (Val1 if test1 else Val2 if test2 else Val3 if test3 else Val4)
>        + Best order for normal/default conditionals
>        + Best order in general if we weren't used to left-right 
> processing

I an far from convinced on either of these, perhaps because I am not sure 
about the actual claim.

>        - But we *do* expect left->right almost everywhere except 
> assignments

          - Ambiguous.

When expressions a and b both lack boolean operators, as is common in 
Python given that all objects have a boolean value, a if b else c is 
mentally parseable as either (a if) b (else c) or a (if b) (else c).  I 
initially though the proposal intended the first.

         -- Bug prone.  The left->right expectation leads to the wrong 
parsing.

Hence we may expect occasional bugs both in writing and reading this 
construct.

> PEP 308 made it clear that "else" should be last.  Putting the condition
> before the "then" was not as clearcut.
>
> (4)  What sort of punctuation should augment or replace the keywords?
>
> PEP 308 suggested avoiding punctuation, but it wasn't clearcut.

Terry J. Reedy





More information about the Python-Dev mailing list