如何在Python三元运算符上换行?

ned*_*dim 33 python line-breaks

有时,Python中包含三元运算符的行会变得太长:

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

是否有推荐的方法使用三元运算符将换行符设置为79个字符?我没有在PEP 8中找到它.

Mar*_*ers 40

您始终可以使用括号在多个物理线上扩展逻辑线:

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

这称为隐式线连接.

以上使用PEP8所有 - 缩进 - 一步 - 更多样式(称为悬挂缩进).您还可以缩进多余的行以匹配左括号:

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

但这会让你更快地达到80列的最大值.

精确地放置ifelse部分取决于你; 我在上面使用了我的个人偏好,但是没有任何人同意的运营商的具体风格.


Pet*_*ood 33

PEP8说打破长线首选方法是使用括号:

包装长行的首选方法是在括号,括号和括号内使用Python隐含的行继续.通过将表达式包装在括号中,可以在多行中分割长行.这些应该优先使用反斜杠来继续行.

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

  • @Mark Python 引用是在最初的问题中。 (2认同)

小智 11

请记住Python 之禅的建议:“可读性很重要”。

当三元运算符都在一行上时,它的可读性最高。

x = y if z else w

当您的条件或变量超过 79 个字符时(参见 PEP8),可读性开始受到影响。(可读性也是为什么字典/列表理解最好保持简短的原因。)

因此,与其尝试使用括号来换行,不如将其转换为常规if块,您可能会发现它更具可读性。

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."
Run Code Online (Sandbox Code Playgroud)

奖励:上述重构揭示了另一个可读性问题:does_not_haggle反转逻辑。如果您可以重写该函数,这将更具可读性:

if haggles(brian):
    answer = "It's worth ten if it's worth a shekel."
else:
    answer = 'Ten for that? You must be mad!'
Run Code Online (Sandbox Code Playgroud)

  • @javadba 不需要其他“answer”声明。两个分支都包含声明。 (2认同)