3

次のような、密接に関連する仮パラメーターを持つ関数の場合

def add_two_numbers(n1, n2):
    return n1 + n2

def multiply_two_numbers(n1, n2):
    return n1 * n2

上記のように、両方の関数のパラメーターに同じ名前を付けるのは良い考えですか?

別の方法は、関数の 1 つでパラメーターの名前を変更することです。例えば:

def add_two_numbers(num1, num2):
    return num1 + num2

両方の関数でそれらを同じに保つと、それぞれが取るパラメーターが類似しているため、より一貫しているように見えますが、それはより混乱を招きますか?

同様に、以下の例ではどちらが適切でしょうか?

def count(steps1, steps2):
    a = 0
    b = 0

    for i in range(steps1):
        a += 1

    for j in range(steps2):
        b += 1

    return a, b

def do_a_count(steps1, steps2):
    print "Counting first and second steps..."
    print count(steps1, steps2)

それ以外の場合、2 番目の関数の引数を変更すると、次のようになります。

def do_a_count(s1, s2):
    print "Counting first and second steps..."
    print count(s1, s2)

繰り返しますが、どの方法が最適かについては少しわかりません。同じパラメーター名を維持すると、2 つの関数間の関係がより明確になりますが、2 つ目の方法は、2 つの関数でパラメーターを混同する可能性がないことを意味します。

私は少し検索しましたが (PEP-8 のスキミングを含む)、決定的な答えを見つけることができませんでした。(私が見つけたSOに関する同様の質問には 、Python関数のオプション引数の命名方法Pythonでは、 __init__ 引数とインスタンス変数に同じ名前を使用しないようにする最善の方法は何ですか?が含まれていました。 )

4

3 に答える 3

8

別の名前を使用する正当な理由がない限り、名前は同じままにします...位置引数でさえキーワードで呼び出すことができることを覚えておいてください。

>>> def foo(a,b):
...     print a
...     print b
... 
>>> foo(b=2,a=1)

「キーワード」を同じに保つことは、そのまれではあるが合法的なコーナーケースに役立ちます...

于 2012-09-17T19:33:14.540 に答える
2

一般に、関数のパラメーターには意味のある名前を付ける必要があり、それらの名前を選択するときに他の関数との関係を考慮してはいけません。2 つの関数のパラメーターの名前は、たとえ関数が同様のことを行うとしても、互いに何の関係もありません。

ただし...関数が同様のことを行う場合、それはリファクタリングを見逃したという兆候でしょうか? :)

于 2012-09-17T20:16:55.500 に答える
1

ここでの重要なガイドラインは、適切な名前を付ける必要があるということです。理想的には、1 年後にコードに戻ったときにパラメーターに付けられると推測される最初の名前です。

すべてのプログラマーには一連の規則があります。二項関数n1n2;に整数引数を呼び出すのが好きな人もいます。他のようなnm; またはlhsrhs; または、他の何か。1 つを選んでそれに固執する限り (それが合理的である限り)、数秒後にあなたのスタイルを学習した後、他の誰もがあなたのコードを読んで理解することができます。あちこちで異なる名前を使用すると、さらに多くの推測を行う必要があります。

mgilson が指摘しているように、これにより、必要に応じてキーワード パラメータを使用できます。これは、オートコンプリートを備えた IDE がより便利であることも意味し(…n1…, …n2…)ます。ポップアップが表示されたら、2 つの整数を渡したいことがわかります。しかし、主に読みやすさのためです。

もちろん、意味が異なる場合は、別の名前を付けてください。add_two_numbers(augend, addend)コンテキストによっては、 とを使用するのが合理的かもしれませんmultiply_two_numbers(factor, multiplicand)

于 2012-09-17T20:17:26.357 に答える