不止一次聽到對默認參數的批評,由於它讓 API 變得模糊。bash
對默認參數的批評,主要是在其餘語言中(靜態語言,動態語言因爲沒有『方法重載』,出現得少)。究其緣由,我以爲主要是:語法上不夠天然,對看代碼的人不友好。spa
好比C++中:code
一個方法
void DoSomething(int a, int b=100);
調用的人
1. DoSomething(1)
2. DoSomething(1, 1000)
複製代碼
.若是沒有充分的上下文,乍一看,還覺得這是兩個重載方法,給人帶來了心智負擔。class
因此在C++中,通常比較少使用默認參數。語法
Python 中,也不能避免上面的缺陷,甚至缺陷更加厲害 。好比仍是上面的代碼,Python容許你這樣寫代碼:方法
1. DoSomething(1)
2. DoSomething(1, 1000)
3. DoSomething(1, b=1000)
複製代碼
這就很坑爹了,要是參數一多,組合狀況更加多,甚至還莫名其妙報錯。1 是正常操做,2 是壞習慣的寫法,3 是好習慣的寫法。項目
因此,從這個角度來看,Python 彷佛讓狀況變得更加糟糕了。那麼,是否應該『由於怕噎着,因此乾脆不吃飯,餓死』?最佳實踐
徹底沒必要如此。而且,這是體現做爲 API 做者的素養的機會來了。語言
首先是 Python 3(假設 >= 3.5)。利用新特性便可,讓調用端只能使用第 3 種寫法。好比di
def DoSomething(a, *, b=10, c=100, d=1000):
pass
調用端只能:
要麼按照不去理會默認參數:DoSomething(100)
要麼多打點字符:DoSomething(100, b=100, c=11, d=0) ( 這樣,代碼美觀不少。 )
複製代碼
其次是 Python 2。解決方案是:換 Python 3。或者你假設你旁邊的 Python 使用者,都是高素質人才,你們都是堅決按照最佳實踐寫代碼(這種機率有多大?)。
另外,如今已經沒有人或文章,談論 2 和 3的問題了。保守派的新項目,都是 Python 3.5 起 了( 俺們的新項目是 3. 6 )。