PEP 308: ternary operator
Terry Hancock
hancock at anansispaceworks.com
Thu Feb 20 01:25:19 EST 2003
(I've not been reading c.l.py for a few days, so I'm not sure which branch
of this thread to reply to)
I have always hated C's ternary operator syntax! I never used it that
much, and every time I did I had to look up the syntax. I REALLY hope
Python does not simply adopt this syntax, as I think it will go on
torturing newbies and casual programmers like myself if it does. Here's
why it bothers me:
1) Is it <cond>? <a>:<b> or <cond>: <a>?<b>
I can never remember this!
2) Is it <a> ? <cond>: <b> or <cond>:<a>?<b>, or how about <a>:<cond>?<b>
They all make exactly the same amount of sense to me. (Which is to say, not
much).
Note that I am not objecting to the functionality, but rather the symbols
used to encode it. I find them highly arbitrary.
Likewise, I find the current kludge of using <cond> and <a> or <b> to be
annoyingly idiomatic. It works by a kind of trick, and not for the reason
it reads well. It gets you when you're not expecting it, and surely that's
a good reason not to use it. Again, this is for newbies and casual
programmers, but my understanding of Python is that it's supposed to be
newbie-friendly.
I also find the (if <cond>: <a> else <b>) syntax confusing because it looks
too much like the statement syntax, and I just can't warm up to the
parentheses. I especially don't like the overloaded meanings of the
keywords.
I therefore would like to voice support for either of the following
"new-keyword" options:
d = <a> when <cond> else <b>
This is my favorite -- thank you M. Pinard! I like the chaining which is
superior to the C alternative of nesting the expressions. I also think
this one reads the nicest, and does not cause confusion. Although: "where"
is just as good as "when", BTW, and has the advantage of being used in
nearly the same way in IDL. Not that we care, but I think it's true. I
don't really prefer either over the other.
The main thing I like is that it properly places the most common action
(d=<a>) at the beginning where it reads nicely. Then we add the exceptional
case onto the end. It has the feel of the try-except syntax in miniature.
Each successive "when" introduces a fall-back.
d = <cond> then <a> else <b>
This is a concession. If you must have the <cond> <a> <b> order, please use
this one. However, I don't like it as much, because:
1) It does not read as an expression in English.
2) "then", while not a Python keyword is part of an "if" block in so many
other languages (especially Perl and shell languages), I feel it could be
confusing to people switching back and forth. "when" does appears as a
keyword in some languages, but is much more distinct (and also usually
appears in expression syntaxes, I think -- just like "where" in IDL).
Neither of these objections is a killer though -- I could learn the
then-else syntax and be happy with it.
I think that the improved clarity is worth the hassle of introducing a
keyword.
I would also like to say that I find a greater need for what the ternary
operator does in Python than I do in C. I'm not sure why, but it comes up
more often. Maybe I'm just remembering using it in Zope (where it is
definitely useful in DTML -- and probably ZPT too). So far I've gotten
away with the <cond> and <a> or <b> syntax, but I don't like the potential
pitfalls -- it always adds an extra amount of testing to make sure I'm not
fooling myself.
Anyway, that's my two cents on it.
Cheers,
Terry
--
Anansi Spaceworks
http://www.anansispaceworks.com
More information about the Python-list
mailing list