2017-09-01 46 views

回答

0

你會得到不同的意見。就我個人而言,我認爲只要可能,使用關鍵字參數是嚴格更好,因爲它將人類可讀的語義附加到函數調用。讀者可以在猜測參數應該是什麼而不需要進一步檢查代碼/文檔時有一個體面的注意。

但是,在使用衆所周知的功能時,有時會省略關鍵字。

1

我在使用顯式名稱時看到的主要好處是對函數簽名的修改對依賴它的代碼的影響較小。

例如,假設你使用一個模塊的功能,定義爲:

their_function(a, b, c=1) 

你通過與c關鍵字參數調用它:

their_function(myA, myB, myC) 

但現在,該模塊的開發人員發現有另一個關鍵字參數是有用的,在他們的想法中,它更有意義,它在c之前。 所以,現在的功能是:

their_function(a, b, d=2, c=1) 

到處打電話their_function(myA, myB, myC),現在myC傳遞給their_functiond,一切都搞砸了。

在另一方面,有您their_function(myA, myB, c=myC)稱它的關鍵字參數映射會一直讓myC會依然被傳遞到their_functionc

當然,這可能是矯枉過正的明顯功能,如printopen其位置論證是自然的。 但我發現確實可以打電話給open(path, 'r', encoding='utf8'),而不是open(path, 'r', 'utf8'),因爲即使我訂購錯誤,行爲仍會如預期。


對於我來說,除了在少數情況下,這將是反直覺,我傾向於強制使用的關鍵字參數的名稱。

Python 3中,從一些版本,可以讓你做到以下幾點:

def my_function(a, b, *, c=1): 
    pass 

這裏,使用圖示操作*單獨告訴Python沒有位置參數可以在第三個之後被發現。 將第四個參數作爲位置參數傳遞時,這將導致TypeError,即沒有命名它。

>>> my_function(1) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: my_function() missing 1 required positional argument: 'b' 

>>> my_function(1, 2) 
# OK 

>>> my_function(1, 2, 3) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: my_function() takes 2 positional arguments but 3 were given 

>>> my_function(1, 2, c=3) 
# OK 

這可以幫助你讓你的代碼更防呆,許多位置或關鍵字參數定義函數時尤其如此。