How to make a line break on the Python ternary ope

2020-02-20 06:33发布

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.

3条回答
smile是对你的礼貌
2楼-- · 2020-02-20 07:14

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.

查看更多
爱情/是我丢掉的垃圾
3楼-- · 2020-02-20 07:26

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!'
查看更多
何必那么认真
4楼-- · 2020-02-20 07:33

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.")
查看更多
登录 后发表回答