45

何をするのが良いですか?

self.call(1, True, "hi")

また

self.call(1, True, "hi",)

そして、次の場合はどうなりますか?

self.call(
    1,
    True,
    "hi"
)

また

self.call(
    1,
    True,
    "hi",
)

データ構造に末尾のコンマを追加する理由はよく知られていますが、関数呼び出しについてはどうでしょうか。

4

5 に答える 5

25

また、このスレッドがかなり長い間ここにあったとしても、ここに私の 2 セントを残します:)

PEP8は実際に末尾のコンマをいつ使用するかを示しており、その推奨事項に従う場合 (必須ではありませんが、間違いなく推奨されます)、2 番目のワンライナーの例は除外できます。

いいえ:

self.call(1, True, "hi",)

はい:

self.call(
    1,
    True,
    "hi",
)

関数呼び出しでの使用法 (控えめに使用して never ) とその理由は次のとおりです。


  • コーディングの原則の 1 つは、関数は1つのことだけを行うべきだというものです。そのため、末尾のコンマを見ると、本当にすべきではないときに、多くの質問が発生する可能性があります。通常、末尾のコンマがどこかにある場合、その内容は時間の経過とともに変化すると予想されます。したがって、それがlisttupledictなどである場合、通常、それを設計した人は誰でも、そのデータ構造の行を物理的に追加または削除または切り替えることを意図してそれを行ったことを示しています。機能する場合は、より良い設計を検討する必要があります。

  • 前述のように、関数は非常に予測可能である必要があります。月にメールとロケットを同時に送信する関数を設計しないでください。また、メールを送信するために呼び出すときに末尾のコンマを残します。ロケットをいつ送信するかは誰にもわかりません。乱雑な diff を少なくしたい (それは混乱を招き、デザインが貧弱になるだけです)。

  • 任意の数のパラメーター(または固定されているが多数のパラメーター) は、通常、そこでオブジェクトをインスタンス化しているか、複数のことを行っていることを示しています。より小さな関数で、それぞれが 1 つのことを行うため、末尾のコンマは必要ありません。

  • また、複数のパラメーターで呼び出すことができる関数があったとしても、それを行う頻度とそれが何を意味するかを考えてみてください。それは次のようなことを意味します。

    • 通常、関数の結果は変数に格納され、その新しい結果を使用する必要があるため、呼び出し場所 (別の関数、モジュール、またはどこかにある可能性があります) でコードをリファクタリングします。これはリファクタリングを意味します。
    • リファクタリングを意味しない場合は、関数が何も返さないか、同じものを返すことを意味します。この場合、呼び出しで渡された追加の引数を使用して複数のことを行うことを意味します。これは、前述のように、はあまり理想的ではありません。

実際の使用


  • あなたがデータ構造で言ったように、末尾のコンマは理にかなっています。データ構造は時間の経過とともに物理的に変化すると予想されます。実行時に変更すると、エディターにあるものには何の意味もありません.空の構造[]xDである可能性がある定義

  • データ構造 (リスト、ディクテーション、セット、タプルなど) が変更されることが予想される場合 (物理的にはソース コード)、実際には末尾のコンマが推奨され、実際に役立ちます (完全な PEP リンクを参照してください。ユース ケースと推奨事項があります)。

結論:


  • 物理的に変化することが予想される複数行のデータ構造で推奨
  • 関数呼び出しではめったにありません
  • 関数定義では決して
于 2018-04-04T15:23:41.967 に答える
15

データ構造では、項目を追加しやすくするために末尾のコンマが「役立ちます」:

a = [
      1,
      2,
      3,
    ]

に変更する方が簡単です

a = [
      1,
      2,
      3,
      4,
      5,
    ]

という行を編集する必要がないからです3,

しかし、通常は長さが変わらない関数呼び出しには、そのような利点はありません。したがって、末尾のコンマの使用はお勧めしません。

于 2012-08-23T08:38:44.543 に答える