web-dev-qa-db-ja.com

PEP 8、キーワード引数またはデフォルトのパラメーター値に「=」の周りにスペースがないのはなぜですか?

なぜ PEP 8は、キーワード引数またはデフォルトのパラメーター値に=の前後にスペースを入れないことを推奨しています

これは、他のすべての= in Python code)の前後にスペースを推奨することと矛盾していますか?

方法:

func(1, 2, very_long_variable_name=another_very_long_variable_name)

より良い:

func(1, 2, very_long_variable_name = another_very_long_variable_name)

Pythonの [〜#〜] bdfl [〜#〜] による議論/説明へのリンクを歓迎します。

念のため、この質問はデフォルト値よりもkwargsについてのものです。PEP8のフレージングを使用しました。

私は意見を求めていません。私はこの決定の背後にある理由を尋ねています。これは、whyに、Cプログラムのifステートメントと同じ行で{を使用し、whether使用するかしないか。

90
soulcheck

これは、キーワード引数が変数の割り当てと本質的に異なるためだと思います。

たとえば、次のようなコードがたくさんあります。

kw1 = some_value
kw2 = some_value
kw3 = some_value
some_func(
    1,
    2,
    kw1=kw1,
    kw2=kw2,
    kw3=kw3)

ご覧のとおり、まったく同じ名前のキーワード引数に変数を割り当てることは完全に理にかなっています。そのため、スペースなしでそれらを表示するための読みやすさが向上します。キーワード引数を使用し、変数をそれ自体に割り当てていないことを認識するのは簡単です。

また、パラメータは同じ行に配置される傾向がありますが、通常、割り当てはそれぞれ独自の行にあるため、スペースの節約が重要な問題になる可能性があります。

63
fortran

デフォルト引数としてvery_long_variable_nameを使用しません。だからこれを考慮してください:

func(1, 2, axis='x', angle=90, size=450, name='foo bar')

これについて:

func(1, 2, axis = 'x', angle = 90, size = 450, name = 'foo bar')

また、変数をデフォルト値として使用することはあまり意味がありません。おそらくいくつかの定数変数(実際には定数ではありません)で、その場合は、できるだけ大文字で説明的で短い名前を使用します。だからanother_very _...

12
rplnt

IMOで引数のスペースを省くと、引数と値のペアがより明確に視覚的にグループ化されます。整頓されているように見えます。

8
JoeC

長所と短所があります。

PEP8準拠のコードがどのように読み取られるかは非常に嫌いです。私は、very_long_variable_name=another_very_long_variable_nameは、very_long_variable_name = another_very_long_variable_name。これは人々が読む方法ではありません。特に構文の強調表示がない場合は、追加の認知的負荷です。

ただし、大きな利点があります。間隔の規則が順守されている場合、ツールを排他的に検索しますtoolsを使用すると、はるかに効果的です。

8
Hywel Thomas

これにはいくつかの理由があると思いますが、単に合理化しただけかもしれません。

  1. スペースを節約し、より多くの関数定義と呼び出しが1行に収まるようにし、引数名自体のスペースを節約します。
  2. 各キーワードと値を結合することにより、カンマの後のスペースで異なる引数をより簡単に分離できます。つまり、指定した引数の数をすばやく確認できます。
  3. この構文は、同じ名前を持つ変数の割り当てとは異なります。
  4. さらに、構文は(さらに)等値チェックとは異なりますa == bこれは、呼び出し内で有効な式にすることもできます。
3
otus

私にとっては、コードが読みやすくなるため、良い慣例です。

変数の割り当てと関数のキーワードの割り当てのスタイルに関する重要な違いは、前者の行には_=_が1つだけであるのに対して、一般的には1行に複数の_=_があることです。後者。

他に考慮事項がない場合は、_foo = 42_を_foo=42_よりも優先します。後者は等号の通常のフォーマット方法ではなく、前者は変数と値を視覚的にうまく空白で区切るためです。

ただし、1行に複数の割り当てがある場合は、f(foo=42, bar=43, baz=44)よりもf(foo = 42, bar = 43, baz = 44)を優先します。前者は複数の割り当てを空白で視覚的に分離しますが、後者はそうではないため、少し難しくなりますキーワード/値のペアの場所を確認します。

これを別の方法で示します。そこにis規則の裏に一貫性があります。その一貫性は次のとおりです。「最高レベルの分離」は、スペースを介して視覚的に明確になります。低いレベルの分離はありません(高いレベルを分離する空白と混同されるため)。変数の割り当ての場合、最高レベルの分離は変数と値の間です。機能キーワードの割り当ての場合、最高レベルの分離は個々の割り当て間です。

1
Denziloe