2012-02-10 132 views
5

的是我想要做的基本思路是:如何爲同一功能設置不同的輸入類型?

def aFuncion(string = '', dicti = {}): 
    if len(str) > 0: 
     print 'you gave string as input' 
    if len(dicti) > 0: 
     print 'you gave a dict as input' 

aFunction(string = 'test') 
dict['test'] = test 
aFunction(dicti = dict) 

我知道這種想法是可以在更OO型的語言,但是這也有可能在Python?

現在我做

def aFuncion(input): 
    if type(input) == str: 
     print 'you gave string as input' 
    if type(input) == dict: 
     print 'you gave a dict as input' 

aFunction('test') 

但我想區別是明確的,當函數被調用

回答

3

想要「在調用函數時清晰的區別」這一目標不會與語言的設計理念擦得太緊密。谷歌「鴨子打字」的更多信息。接受的輸入應該由函數的文檔字符串來表示,這就是你需要做的。

在python中,當你希望你的輸入是一個字符串或字典,那麼你只需編寫代碼,假設輸入將是一個對象,其行爲表現爲字符串或類似字典的方式。如果輸入不是,那麼你可以嘗試處理,如果你想要的話,但通常你可以簡單地讓你的代碼簡單地彈出一個未處理的異常。這讓球回到了主叫方的法庭,要麼決定如何處理這種情況,要麼意識到他們發送的數據不好。

類型檢查通常應該避免,如果確實需要,應該使用isinstance來完成,而不是像您所做的那樣檢查類型。這具有在繼承情況下更靈活的優點。

def aFuncion(input_): 
    if isinstance(input_, str): 
     print 'you gave a string-like input' 
    elif isinstance(input_, dict): 
     print 'you gave a dict-like input' 

aFunction('test') 

在python3中,您現在有另一種使用類型提示功能註釋的選項。有關該功能的更多詳細信息,請閱讀PEP 484

+0

+1關於語言哲學的好處。另外我相信你應該改變'input'參數的名字(現在它覆蓋了一個內置函數)。 – Tadeck 2012-02-10 10:29:24

6

具有相同的方法支持不同的參數類型被稱爲multiple dispatch or multimethods的想法。

爲了得到一個很好的介紹,你可以閱讀這個Guido Van Rossum article並看看PyPi,因爲有幾個multimethod packages可用。

+0

謝謝,我不知道名稱(正在尋找多態性),應該有幫助 – 2012-02-10 09:58:20

0

你有什麼基本的工作,只有一些變量聲明的麻煩。這是一個工作vesrion:

def aFunction(str = '', dicti = {}): 
    if len(str) > 0: 
     print 'you gave string as input' 
    if len(dicti) > 0: 
     print 'you gave a dict as input' 

str = 'test' 
dicti = dict([('test', 'test')]) 
aFunction(str = str) 
aFunction(dicti = dicti) 
aFunction(str = str, dicti = dicti) 
aFunction(dicti = dicti, str = str) 

看跌期權:

you gave string as input 
you gave a dict as input 
you gave string as input 
you gave a dict as input 
you gave string as input 
you gave a dict as input 

您還可以發送到功能既是一個列表和字典(見What is a clean, pythonic way to have multiple constructors in Python?例如)非特異性參數。

+0

您的回答是錯誤的。你仍然可以用'aFunction([1,2,3])'調用'aFunction',它會假設你給它一個字符串(顯然不是這樣)以及'aFunction(dicti =「這不是一個字典「),它會假設你輸入了一個字典。 @wim使用鴨子打字得到了正確的答案。給給定類型賦一個默認參數不會給你保證,因爲Python是一種弱類型的語言,它可能在運行時改變。 – 2015-11-24 11:47:46

相關問題