web-dev-qa-db-ja.com

関数呼び出しの最後の引数の後に末尾のコンマを追加する必要がありますか?

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

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

または

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

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

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

または

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

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

26
taper

関数呼び出しでコンマの末尾を避ける技術的な理由はないと思いますが、おそらく気が散る人もいます。立ち止まって言う人もいます:

「うーん、本当にそこにあるはずなのかしら?」

私はこれを利点と呼ぶことを躊躇しますが、インデントされたスタイルと組み合わせて末尾のコンマを使用することの1つの効果バージョン管理の差分を表示するため)です少しきれいに引数を追加するとき。

たとえば、次のような関数:

def my_fun(a, b, c=None):
    ...

...このように呼ばれます:

my_fun(
    a='abc',
    b=123
)

...次にこれに変更しました:

my_fun(
    a='abc',
    b=123,
    c='def'
)

この差分をgitで生成します:

$ git diff
...
 my_fun(
     a='abc',
-    b=123
+    b=123,
+    c='def'
 )

一方、

my_fun(
    a='abc',
    b=123,
)

に変更されました...

my_fun(
    a='abc',
    b=123,
    c='def',
)

この差分をgitで生成します:

$ git diff
...
 my_fun(
     a='abc',
     b=123,
+    c='def',
 )
35
Jacob Wan

データ構造では、末尾のコンマはアイテムの追加を容易にするために「便利」です。

a = [
      1,
      2,
      3,
    ]

に変更する方が簡単です

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

3,という行を編集する必要がないためです。

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

12
Tim Pietzcker

私もここに私の2セントを残します、たとえこのスレッドがかなり長い間ここにあったとしても、それは誰かに利益をもたらすかもしれません:)

PEP8実際には 末尾のコンマを使用する場合 と言います。推奨事項に従う場合(必須ではありませんが、間違いなく推奨)、2番目のワンライナーあなたの例は除外することができます、すなわち:

番号:

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

はい:

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

関数呼び出しでの使用法(絶対に使用しない)およびその理由は次のとおりです。


  • コーディングの原則の1つは、関数が実行する必要があるということです1つのこと、および1つのことのみ。そのため、末尾のコンマを見ると、実際にはそうすべきではないのに、多くの疑問が生じる可能性があります。通常、どこかに末尾のコンマが表示されている場合は、expectそのことを時間の経過とともに変化にします。したがって、それがlistTupledictなどの場合、通常、それを設計した人が、物理的に追加または追加する意図でそれを行ったことを示します。その構造内の行を削除または切り替えると、まあ...関数ではそれほど多くは見られないか、少なくともそうすべきではありません。そうする場合は、より良い設計を検討する必要があります。

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

  • 任意の数のパラメーター(または固定されているが多数のパラメーター)は通常、オブジェクトをインスタンス化しているか、複数のことを行っているの場合を示します。実際にすべきことは、デザインを複数の小さな関数の作成に分割することです。つまり、それぞれが1つのことを実行します、したがって末尾のコンマは不要です。

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

    • 通常、関数の結果は変数に格納され、その新しい結果を使用する必要があるため、呼び出し場所(別の関数、モジュール、またはどこかにある可能性があります)でコードをリファクタリングすることを意味します。これはリファクタリングを意味します。
    • リファクタリングを意味しない場合は、関数が何も返さないか、同じものを返すことを意味します。この場合、呼び出しで渡された追加の引数を使用して複数のことを実行します。これは、前述のとおりです。 、あまり理想的ではありません。
    • コーディングの原則を気にせず、上記を無視したとしても、これはどのくらいの頻度で行われますか?答えが頻繁にある場合、それは別の貧弱で不安定な設計実装です。そして、それがあまり頻繁ではない場合(まあ、それはそこにあるべきではないとそれ自体でほとんど答えます、そしてあなたがそうすべきだと思ったとしても、あなたの目はあなたが避けることができるようにバージョン管理差分で別の余分な線を引くことができると思いますあなたのプロジェクトを共有している人々のランク内で余分な混乱を引き起こします。

実際の使用法


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

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

結論:


  • 推奨物理的に変化すると予想される複数行のデータ構造
  • めったにない関数呼び出しで
  • 決して関数定義では
9
Marius Mucenicu

この問題では、関数の引数リストがまさにそれであるため、リストやタプルの場合と同じ理由が当てはまると思います。

これは、言語に対して行われた設計上の決定に関するFAQ)からの引用です( c.f。 ):

なぜPythonリストとタプルの最後にコンマを許可するのですか?

Pythonでは、リスト、タプル、および辞書の最後に末尾のコンマを追加できます。

[1, 2, 3,]
('a', 'b', 'c',)
d = {
    "A": [1, 5],
    "B": [6, 7],  # last trailing comma is optional but good style
}

これを許可する理由はいくつかあります。

リスト、タプル、またはディクショナリのリテラル値が複数行にまたがっている場合、前の行にコンマを追加することを覚えておく必要がないため、要素を追加する方が簡単です。構文エラーを作成せずに行を並べ替えることもできます。

誤ってコンマを省略すると、診断が難しいエラーが発生する可能性があります。例えば:

x = [
  "fee",
  "fie"
  "foo",
  "fum"
]

このリストには4つの要素があるように見えますが、実際には「fee」、「fiefoo」、「fum」の3つが含まれています。常にコンマを追加すると、このエラーの原因を回避できます。

末尾のコンマを許可すると、プログラムによるコード生成も簡単になる場合があります。

4
moooeeeep

これはツール固有ですが、実際には、vim/Gvimで、単一行の関数パラメーターリストでもコードのリファクタリングがはるかに簡単になります。

def foo(a、b、c、e、d、):

に変更されました

def foo(a、b、c、d、e、):

Vimを使用する場合は、「e」または「d」を削除するだけで、2回のキーストローク(dW)で貼り付けたい場所に移動し、(p)を押します。

終了コンマがない場合は、新しい最後のアイテムから削除して、古い最後のアイテムに追加する必要があります。または、カンマまで削除してより正確に貼り付けるように注意する必要があります。どこにでもコンマがあれば、すべてを均一なチャンクとして扱い、簡単に交換できます。

Vimは明らかにpythonライターに非常に人気があるので、これには実際にいくつかのメリットがあるようです: https://www.sitepoint.com/which-code-editors-do-pythonists-use /

1
horta