For review: PEP 308 - If-then-else expression

Andrew Dalke adalke at mindspring.com
Sat Feb 8 03:31:59 EST 2003


Terry Reedy:
> x = cond1 ? expr1 :
>       cond2 ? expr2 :
>       cond 3? expr3 :
>                    expr4 ;
>
> I am not sure but what I would rather stick with and/or when safe
> rather then reverse order of conds and exprs.

Just guessing, but I'll bet that in most cases it was written like

color_name = (color == RED) ? "roja":
                      (color == BLUE) ? "azul":
                      (color == GREEN) ? "verde":
                      (color == BLACK) ? "negro":
                      "no sé";

If so, it can be replaced with a dict lookup, as in

color_name = {RED: "roja", BLUE: "azul",
                       GREEN: "verde", BLACK: "negro"}.get(color, "no sé")

Or perhaps it was like

size = (val < 1) ? "small":
         (val < 4) ? "medium":
         (val < 7) ? "large":
         (val < 11) ? "x-large":
         ("xx-large");

If so, this could be rewritten as

size = "xx-large"
for threshold, name in (1, "small"), (4, "medium"), (7, "large"), (11,
"x-large"):
  if val < threshold:
    size = name
 else:   # these two lines optional but faster
   break

or the more ugly (but faster for long lists)

cutoffs = (1, "small"), (4, "medium"), (7, "large"), (11, "x-large"), (None,
"xx-large")
_cutoff_keys = [x[0] for x in cutoffs[:-1]]
_cutoff_vals = [x[1] for x in cutoffs]
   ...
size = _cutoff_vals[bisect.bisect_right(_cutoff_keys, val)]

The trinary expression is, I'll grant you, easier to read.  However,
it isn't data oriented, it's control oriented.  In most cases you'll need
to read those values from a file or other source.

Yes, that trinary tree can be more complicated.  But in that case
debugging the trinary tree means breaking it down to look at the
parts, as compared to statements which would let you insert print
statements very easily.

                    Andrew
                    dalke at dalkescientific.com






More information about the Python-list mailing list