2012-09-17 116 views
3

對於密切相關的形式參數的功能,如參數命名約定在Python

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

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

這是個好主意,讓在這兩個函數的參數相同的名稱,如上圖所示?

另一種方法是重命名其中一個函數中的參數。例如:

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) 

否則,在第二個函數變化的參數得出:

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

同樣,我有點不能確定其方式是最好的。保持相同的參數名稱使得兩個函數之間的關係更清晰,而第二個參數名稱不存在混淆兩個函數中的參數的可能性。

我已經做了一些搜索(包括通過PEP-8瀏覽),但找不到明確的答案。 (在這樣類似的問題,我發現包括: Naming practice for optional argument in python functionIn Python, what's the best way to avoid using the same name for a __init__ argument and an instance variable?

+0

「,而第二種方法不可能混淆兩個函數中的參數。」你能舉出一個你擔心的混亂的例子嗎? –

+0

在這些情況下,沒有太多的機會讓它們混在一起(也許這通常是真的......)我想我更多地使用與變量參數相同的名稱,這可能不是一個好主意。 –

回答

8

我會保持名稱不變,除非你有一個很好的理由使用不同的名字......請記住,即使位置參數可以通過關鍵字調用如:

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

保持「關鍵詞」同樣有助於罕見,但合法的角落情況下...

2

在一般情況下,你應該給你的函數的參數名有意義,甚至不會考慮當您選擇這些名稱時與其他功能有關的任何事情。兩個函數參數的名稱根本就沒有任何關係,即使函數做了類似的事情。

雖然...如果功能做類似的事情,也許這是一個跡象,你已經錯過了重構? :)

1

這裏重要的指導方針是,您應該給他們合理的名字 - 理想情況下,當您在一年後回到代碼時,您會猜出第一個名字。

每個程序員都有一套約定。有些人喜歡調用二進制函數n1n2的整數參數;其他像n,m;或lhs,rhs;或者是其他東西。只要你選擇一個並堅持下去(只要它是合理的),任何人都可以在幾秒鐘內瞭解你的風格後閱讀你的代碼並理解它。如果你在不同的地方使用不同的名字,他們將不得不做更多的猜測。

正如mgilson指出的,這允許您使用關鍵字參數,如果你想。這也意味着具有自動完成功能的IDE更有用 - 當您看到彈出的(…n1…, …n2…)時,您知道要傳遞兩個整數。但主要是爲了可讀性。

當然,如果有不同的含義,給他們不同的名字。在某些情況下,add_two_numbers(augend, addend)multiply_two_numbers(factor, multiplicand)可能是合理的。