PEP 308: some candidate uses cases from live code

Tony Lownds tony-clpy at
Mon Feb 10 05:34:24 CET 2003

[Tim Peters]
> [Martin Maney]
> > ...
> >     Becomes, after a little rearrangement:
> >
> >         sy = d0.year - (1 if d0.month < 7 else 0)
> >
> >     I think this actually expresses the original logic a little more
> >     clearly: the school year is the day's year unless the day's month is
> >     January through June; then one must be subtracted to get the
> >     year during which the school year began.
> Me too, but note that it could be written (even in Python 1.0):
>     sy = d0.year - (d0.month < 7)
> That bools are confusable with 0 and 1 in Python is A Feature.

With the ?: syntax the rearrangement above becomes:

sy = d0.year - (d0.month < 7 ? 1 : 0)

And the refactoring you did becomes much more obvious.

For me, that a killer problem of PEP308's proposed syntax; with the
condition in the middle,  reading *and* refactoring the code becomes
harder! That is why I cannot vote simply for PEP308.

The only syntaxes I'd like to see are:

   condition "?" then-expr ":" else-expr
   condition "?" then-expr "else" else-expr

I prefer ?: because:

- I liked it better after playing with ?: interactively[1]
- ":" balances "?" better than "else"
- consistent with the C-like language crowd, like python's operators

One argument against ?: (yet another job for the colon) doesn't
me. The three other places I see where colons are used are not likely
see ?: expressions in my opinion, and even then simply adding
can restore readability:

- slicing/indexing:   a[(t?x:y)]
- if statements:   if (t?x:y):
- dictionary literals:    {(t?x:y): value}

In real code ?: replaces three idioms. IMO ?: is more obvious than
and/or, more readable than (false, true)[condition], with better
than either idiom. The ?: syntax offers enough improvement to supplant
use of the aforementioned syntaxes in my python code.

That leaves this idiom:

if test:
  lhs = then-expr
  lhs = else-expr

In some cases I think that kind of code is improved by using a
expression, especially when a complex lhs or common subexpression in
then-expr and else-expr can be factored out. 

-Tony Lownds

[1] ESR has a patch to implement ?: that is easy to modify for current
CVS python

More information about the Python-list mailing list