web-dev-qa-db-ja.com

Python三項演算子で改行する方法は?

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."

三項演算子を使用して79文字で改行する推奨方法はありますか? PEP 8 では見つかりませんでした。

38
nedim

論理行を複数の物理行にまたがって を括弧で拡張できます:

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

これは 暗黙的なライン結合 と呼ばれます。

上記は、PEP8のすべてをインデントした1ステップのスタイル( hanging indent と呼ばれます)を使用しています。左括弧と一致するように余分な行をインデントすることもできます:

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

しかし、これにより、80カラムの最大値に速く到達できます。

ifelseの部分を正確にどこに置くかはあなた次第です。上記の私の個人的な好みを使用しましたが、誰もが同意するオペレーターの特定のスタイルはまだありません。

43
Martijn Pieters

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.")
36
Peter Wood

The Zen of Pythonからのこのアドバイスを覚えておいてください: "読みやすさが重要です。"

三項演算子は、すべてが1行にあるときに最も読みやすくなります。

x = y if z else w

条件または変数が79文字を超えて行をプッシュすると(PEP8を参照)、読みやすさが低下し始めます。 (読みやすさも、dict/listの理解を短くするのに最適な理由です。)

したがって、括弧を使用して改行しようとするのではなく、通常の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."

ボーナス:上記のリファクタリングは、別の読みやすさの問題を明らかにします: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!'
5
John Anderson