Nesting the ternary operator in Python

10.7k views Asked by At

In the Zen of Python, Tim Peters states that Flat is better than nested.. If I have understood that correctly, then in Python, this:

<statement-1> if <condition> else <statement-2>

is generally preferred over this:

if <condition>:
    <statement-1>
else:
    <statement-2>

However, in other languages, I have been told not to nest the ternary operator, and the instead use the traditional if...else. My question, then, is should I use this:

(<statement-1> if <condition-1> else <statement-2>) if <condition-2> else <statement-3>

or

if <condition-2>:
    if <condition-1>:
        <statement-1>
    else:
        <statement-2>
else:
    <statement-3>

? Particularly if the statements and conditions are long, and the first line would need splitting?

3

There are 3 answers

4
Eevee On BEST ANSWER

"Flat is better than nested" is about module organization and perhaps data structures, not your source code. The standard library, for example, mostly exists as top-level modules with very little nesting.

Don't nest the ternary operator, or even use it at all if you can avoid it. Complex is better than complicated. :)

1
Tim Peters On

Your first example (the horrid one-liner) is nested too. Horizontally nested. Your second example is vertically nested. They're both nested.

So which is better? The second one! Why? Because "sparse is better than dense" breaks the tie.

It's easy when you're Tim Peters - LOL ;-)

1
Fong Kah Chun On

To my understanding, this is "flater":

if <condition_2> and <condition_1>:
  <statement_1>
elif <condition_2>:
  <statement_2>
else:
  <statement_3>

The order of the conditions to check is important, e.g. should you put <condition_2> only as the first order of checking, then <statement_1> will never be called.