How to make a line break on the Python ternary operator?

Question:

Sometimes a line containing a ternary operator in Python gets too long:

answer = 'Ten for that? You must be mad!' if does_not_haggle(brian) else "It's worth ten if it's worth a shekel."

Is there a recommended way to make a line break at 79 characters with a ternary operator? I did not find it in PEP 8.

Asked By: nedim

||

Answers:

You can always extend a logical line across multiple physical lines with parentheses:

answer = (
    'Ten for that? You must be mad!' if does_not_haggle(brian)
    else "It's worth ten if it's worth a shekel.")

This is called implicit line joining.

The above uses the PEP8 everything-indented-one-step-more style (called a hanging indent). You can also indent extra lines to match the opening parenthesis:

answer = ('Ten for that? You must be mad!' if does_not_haggle(brian)
          else "It's worth ten if it's worth a shekel.")

but this leaves you hitting the 80-column maximum all the faster.

Where precisely you put the if and else portions is up to you; I used my personal preference above, but there is no specific style for the operator that anyone agrees on, yet.

Answered By: Martijn Pieters

PEP8 says the preferred way of breaking long lines is using parentheses:

The preferred way of wrapping long lines is by using Python’s implied
line continuation inside parentheses, brackets and braces. Long lines
can be broken over multiple lines by wrapping expressions in
parentheses. These should be used in preference to using a backslash
for line continuation.

answer = ('Ten for that? You must be mad!'
          if does_not_haggle(brian)
          else "It's worth ten if it's worth a shekel.")
Answered By: Peter Wood

Bear in mind this advice from The Zen of Python:
“Readability counts.”

The ternary operator is most readable when it is all on one line.

x = y if z else w

When your conditions or variables push the line past 79 characters (see PEP8), readability begins to suffer. (Readability is also why dict/list comprehensions are best kept short.)

So, rather than trying to break the line using parentheses, you might find it is more readable if you convert it to a regular if block.

if does_not_haggle(brian):
    answer = 'Ten for that? You must be mad!'
else:
    answer = "It's worth ten if it's worth a shekel."

BONUS: The above refactoring reveals another readability issue: does_not_haggle is inverted logic. This would be even more readable, if you can rewrite the function:

if haggles(brian):
    answer = "It's worth ten if it's worth a shekel."
else:
    answer = 'Ten for that? You must be mad!'
Answered By: John Anderson
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.