2009-04-09 42 views
58

由於此說:功能在Python超載:缺少

http://web.archive.org/web/20090624083829/http://mail.python.org/pipermail/python-list/2003-May/206149.html

函數重載是在Python缺席。

就我覺得這是一個很大的障礙,因爲它也是面嚮對象語言。最初我發現無法區分參數類型是困難的,但Python的動態特性使它變得容易(例如,列表,元組,字符串非常相似)。

然而,計算通過的參數的數量,然後做這項工作就像是矯枉過正。

+3

那麼,你認爲你需要超載的是什麼? – kquinn 2009-04-09 07:59:15

+2

投票結束不是一個真正的問題。這並不是說它不是一個潛在的有效點,但它不是一個問題。 – 2009-04-09 08:01:02

+0

那麼,然後使用一種語言,提供重載... – 2009-04-09 09:39:22

回答

31

由於放鬆指出,使用默認值的關鍵字參數可以走很長的路要走。

我還會說,在我看來,它違背了Python的精神,非常擔心什麼類型傳遞到方法。在Python中,我認爲使用鴨子打字更容易 - 詢問對象可以做什麼,而不是它是什麼。

因此,如果你的方法可能會接受一個字符串或一個元組,你可能會做這樣的事情:

def print_names(names): 
    """Takes a space-delimited string or an iterable""" 
    try: 
     for name in names.split(): # string case 
      print name 
    except AttributeError: 
     for name in names: 
      print name 

那麼你可以做以下任一:

print_names("Ryan Billy") 
print_names(("Ryan", "Billy")) 

雖然API像有時會表明設計問題。

6

通常情況下,您會看到建議使用use關鍵字參數與默認值相反。研究一下。

22

你不需要函數重載,因爲你有* args和** kwargs參數。

事實上,函數重載是基於這樣的想法,即傳遞不同的類型將執行不同的代碼。如果你有像python這樣的動態類型語言,你不應該按類型區分,但是你應該處理接口以及它們與你編寫的代碼的兼容性。例如,如果您有可以處理整數或整數列表的代碼,則可以嘗試對其進行迭代,如果無法執行此操作,則假定它是整數並繼續前進。當然,它可能是一個浮點數,但就行爲而言,如果float和int看起來相同,那麼它們可以互換。

6

你可以將一個可變容器數據類型傳遞給一個函數,它可以包含任何你想要的東西。

如果你需要一個不同的功能,不同的命名功能,或者如果ü需要一個相同的接口,只寫調用適當的基於數據的功能獲得了接口函數(或方法)。

過了好一會兒給我逐漸適應了這種從Java的到來,但它真正地不是一個「大障礙」