Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is this idiom pythonic? (someBool and "True Result" or "False Result")

I just came across this idiom in some open-source Python, and I choked on my drink.

Rather than:

if isUp:
    return "Up"
else:
    return "Down"

or even:

return "Up" if isUp else "Down"

the code read:

return isUp and "Up" or "Down"

I can see this is the same result, but is this a typical idiom in Python? If so, is it some performance hack that runs fast? Or is it just a once-off that needs a code review?

like image 439
Oddthinking Avatar asked Dec 06 '08 01:12

Oddthinking


2 Answers

The "a and b or c" idiom was the canonical way to express the ternary arithmetic if in Python, before PEP 308 was written and implemented. This idiom fails the "b" answer is false itself; to support the general case, you could write

 return (a and [b] or [c])[0]

An alternative way of spelling it was

 return (b,c)[not a]

which, with the introduction of the bool type, could be rewritten as

 return (c,b)[bool(a)]

(in case it isn't clear: the conversion to bool, and the not operator, is necessary if a is not known to be bool already)

Today, the conditional expression syntax should be used if the thing must be an expression; else I recommend to use the if statement.

like image 120
Martin v. Löwis Avatar answered Oct 04 '22 09:10

Martin v. Löwis


You should read Using the and-or trick (section 4.6.1) of Dive Into Python by Mark Pilgrim. It turns out that the and-or trick has major pitfalls you should be aware of.

like image 38
titaniumdecoy Avatar answered Oct 04 '22 11:10

titaniumdecoy