39

長い if 条件をインデントする場合、通常は次のようにします (実際、PyDev はこのようにインデントします)。

if (collResv.repeatability is None or
    collResv.somethingElse):
    collResv.rejected = True
    collResv.rejectCompletely()

ただし、これにより、if ステートメントによって開始されるブロックが if 条件の最後の部分と同じインデント レベルに配置され、ブロックの開始場所がすぐにわからないため、私の意見では非常に見苦しく/読みにくくなります。

私が考えた他のいくつかのスタイル:

if (collResv.repeatability is None or
        collResv.somethingElse):
    collResv.rejected = True
    collResv.rejectCompletely()

2 行目が最初の行よりもはるかにインデントされているため、これはかなり矛盾しているように見えますが、読みやすいです。

if (collResv.repeatability is None or
  collResv.somethingElse):
    collResv.rejected = True
    collResv.rejectCompletely()

これも最初の例より読みやすくなっていますが、インデントが 4 の倍数ではなくなっていることに加えて、最初の行の条件の開始よりも 2 行目のインデントが少ないため、正しく見えません。


したがって、私の主な質問は次のとおりです。過度に長い行を必要としないような場合 (つまり、単一行の状態) に推奨されるインデント スタイルはありますか? そうでない場合、そのような場合に何好みますか?

4

9 に答える 9

26

多くの場合、独自のステートメントで条件を計算することにより、この問題を回避します。

condition = (collResv.repeatability is None or
             collResv.somethingElse)
if condition:
    collResv.rejected = True
    collResv.rejectCompletely()

ただし、特定の例のようにまだ比較的短い条件の場合は、 noskloのソリューションを使用します。ここで使用される追加のステートメントは、さらに長い条件式に適しています。

于 2011-02-25T12:40:55.307 に答える
15

これが私がすることです:

if (collResv.repeatability is None or
        collResv.somethingElse):
    collResv.rejected = True
    collResv.rejectCompletely()
于 2011-02-25T12:12:24.300 に答える
12

これは間接的な答えです。スタイルの問題に直接答えているわけではありませんが、一般的に実用的な答えなので、言及する価値があります。

複数行の条件を記述する必要があることは非常にまれです。これには 2 つの要因があります。

  • コードを 80 列で折り返さないでください。この件に関する PEP-8 のアドバイスは古くて有害です。80x25 の端末やエディターがラッピングを適切に処理できない時代は過ぎ去りました。100 列は問題なく、通常は 120 列も許容されます。
  • 条件が長くなりすぎてラップする必要がある場合は、通常、ロジックの一部を条件から別の式に移動することが合理的です。これは読みやすさにも役立ちます。

私の最近のプロジェクトを調べてみると、約 12kloc で、ラップする必要があるのに十分な長さの条件が 1 つだけあります。この問題が発生することはめったにありません。これを行う必要がある場合は、nosklo が言うように、個別にインデントします。お気づきのように、その下のブロックと同じレベルにインデントすると、混乱して読みにくくなります。

于 2011-02-25T12:42:56.290 に答える
12

ここでの以前のすべての提案の問題の 1 つは、後続の条件の論理演算子が前の行に置かれることです。Imo、それは読みにくくなります。

if ステートメントに追加する条件と同じ行に論理演算子を配置することをお勧めします。

私の意見では、これはより良いです

if (None == foo
        and None == bar
        or None == foo_bar):

これより:

if (None == foo and
        None == bar or
        None == foo_bar):
于 2013-02-23T09:41:54.373 に答える
3

PEP-8 は実際には矛盾しているように見えます。「最大行長」の例では、括弧と標準の 4 文字のインデントを使用していますが、「インデント」セクションでは、関数宣言に関して、「継続行であることを明確に区別するために、さらにインデントを使用する必要があります。 "。これが「if」ではなく「def」のみに制限される理由がわかりません。

于 2013-03-27T16:41:55.997 に答える
3

私ならこうします。混乱しないように、遠くにインデントしておいてください。

if (collResv.repeatability is None or
                          collResv.somethingElse):
    collResv.rejected = True
    collResv.rejectCompletely()

PEP-8 アドバイスはここにあります。

http://www.python.org/dev/peps/pep-0008/#インデント

以下のコードをお勧めします

# Aligned with opening delimiter
foo = long_function_name(var_one, var_two,
                         var_three, var_four)

# More indentation included to distinguish this from the rest.
def long_function_name(
        var_one, var_two, var_three,
        var_four):
    print(var_one)

以下のコードはお勧めしません

# Arguments on first line forbidden when not using vertical alignment
foo = long_function_name(var_one, var_two,
    var_three, var_four)

# Further indentation required as indentation is not distinguishable
def long_function_name(
    var_one, var_two, var_three,
    var_four):
    print(var_one)
于 2012-08-31T22:53:44.503 に答える
0

そのような場合、私は単純に次のようにします。

if (collResv.repeatability is None or
    collResv.somethingElse):
    # do:
    collResv.rejected = True
    collResv.rejectCompletely()
于 2011-06-15T16:09:17.207 に答える
0

Pep-8 は、元の例をインデントした方法を推奨しています。

ああ、とても神聖なスタイルガイドに直面して喜んで飛ぶなら:-) 演算子を次の行に移動することができます:

if (collResv.repeatability is None
    or collResv.somethingElse):
    collResv.rejected = True
    collResv.rejectCompletely()

私はこれのファンではありません。実際、元の構文はかなり読みやすく、インデントや改行をいじるのに多くの時間を費やすことはありません。

于 2011-02-25T13:16:27.047 に答える
0

私がときどき使用するオプション (ただし、読みやすさを完全に気に入っているわけではありません):

if (collResv.repeatability is None or
    collResv.somethingElse
):
    collResv.rejected = True
    collResv.rejectCompletely()

おそらく、次のようにすると読みやすくなります。

if (
collResv.repeatability is None or
collResv.somethingElse
):
    collResv.rejected = True
    collResv.rejectCompletely()
于 2011-02-25T13:03:36.597 に答える