[Python-Dev] Trinary Operators (original) (raw)

Gary Herron gherron@islandtraining.com
Thu, 6 Feb 2003 15:46:51 -0800


On Thursday 06 February 2003 11:49 am, Guido van Rossum wrote:

> If this is just for fun, why stop with just "trinary"?

(Which BTW is a non-word; the correct term is "ternary".) > How about one of the following (depending on ease of parsing)? > These look even more like list comprehension. > > x = (e1 if c1 e2 if c2 e3 if c3 ... else d) Doesn't parse. The concatenation of two expressions is not always distinguishable from a single expression: consider c1 = f and c2 = (1, 2). > x = (e1 if c1 else e2 if c2 else e3 if c3 ... else d) That works.

Now that I've had a little more time to thing about it, this suggestion of a n-ary form is nothing more than nested ternary forms with extra parentheses removed:

(a1 if c1 else (a2 if c2 else b2))

could be allowed to be written as

(a1 if c1 else a2 if c2 else b2)

and, if you want:

(a1 if c1 else a2 if c2 else b2)

Other sub-threads of this thread are discussing how to parse these ternary operators if the parentheses are not required. I think the parentheses should be required (see below for why) and so it would be nice to allow this extended form and not require the inner set of parentheses when doing "tail nesting" (to invent a term).

BEWARE: UNPYTHONIC UGLINESS FOLLOWS!

On the other hand, if the parentheses are NOT required, we get a whole host of UGLY, absolutely unreadable, nesting possibilities:

a if b else c if d else e <==> (a if b else c) if d else e

and even worse

a if b if c else d else e <==> a if (b if c else d) else e

And what about statements

if a if b else c if d else e: f elif g if h if i else j else k: l else: m

Of course, any feature can be abused, but this seems too abusable.

Gary Herron