2010-09-10 84 views
0

在Python中使用可選參數有什麼好處。使用args +可選參數不是重載一個函數(或方法),而不是使用繼承的多態性就足夠了?Python中的可選參數

我只是想了解具有此功能的燃燒理由。還是能夠以多種方式做一件事?

PS:我可以看到,它是有道理的有它在函數式編程,以避免定義許多功能實際上這樣做幾乎同樣的事情,但是否有任何其他的...

回答

6

可選ARGS與多態性無關(並且甚至不需要你有周圍的類) - 它只是(主要用途!),通常你有「很少需要」的選擇參數一般在某些方式,但它可能是有用的調用方設置不同。

例如,考慮內置open最常見的是,你打開文本文件而不是二進制打開,你打開它們來閱讀而不是寫作,並且你對默認的緩衝很滿意 - 所以,你只需要open('thefile.txt'),並且快樂地生活。能夠指定的方式作爲第二個(可選)參數(而不是其默認的'r'值),您想要打開它(二進制,覆蓋,附加,...)當然是有用的。一旦進入一個藍色的月亮,你需要一個具有特殊緩衝選項的文件對象,然後將緩衝作爲第三個(可選)絕大多數你打開的文件!

繼承和多態並不能真正幫助獲得with open('blah.txt') as f:的簡便性,同時仍然允許相同的內置函數提供更多的用例(例如,當您需要打開文件以進行二進制附加沒有任何緩衝...也許一年一次,如果你編碼很多;-)。當然適用於這樣的內置功能,方便的原則也適用於寫一樣好功能 - !)

4

在Python可選參數一舉多得,但大多數情況下它們是一種機制,提供默認值存在明智和不經常變化的價值。例如爲:

def open_http_connection(url, port=80, timeout=2): 
    #... 

當基於提供,通常使用元數(參數的數目)或關鍵字參數的參數都需要一個方法多個行爲微妙變化。

# Example of arity based optional arguments 
def do_something(*args): 
    if not args: 
    do_something1() 
    elif len(args)==1: 
    do_something2(args[0]) 
    else: 
    do_something3(*args) 

它可能有助於研究位置和關鍵字參數如何變量蟒蛇指定:here

這些用於指定可選和可變數量參數的方法在語法上不如靜態類型的面嚮對象語言中的方法重載或函數式編程語言中存在的各種形式的多重調度那樣複雜。 Python使用動態類型(有時稱爲duck typing),所以這些派遣形式不是慣用的或非常有用的。 (這通常不被視爲限制或缺點,儘管Python肯定足夠靈活以支持multi-methods,如果必須的話)。