2013-01-12 89 views
0

這與方法重載類似。當print Hello(1, 2, 3)得到執行時,它返回"a and b",而我希望它返回"a and b and c"。我知道我可以說if (a and b and c is None)然後它會工作。但是,如果我有20個參數,而且我必須處理所有情況,那麼這只是多個if陳述,我不認爲這是必要的。有沒有更好的辦法,我應該做這樣的問題?方法重載python

def Hello(a=None, b=None, c=None): 
    if(a and b): 
     return "a and b" 
    if(a and c): 
     return "a and c" 
    if(a and b and c): 
     return "a and b and c" 

print Hello(1, 2, 3) 
+0

如果你有20個參數,你需要重新考慮你的設計。 – BrenBarn

+0

如果你有20個參數,那麼沒有人會使用這個功能。你能舉一個你想達到的實例嗎?重載的一個典型用途是處理不同的數據類型,如int和float,但在Python中幾乎不需要。那麼,你的實際用例是什麼? – mmgp

+0

我只是假設什麼約六個參數是最好的方式去與它如果陳述 – user1741339

回答

3

你需要重新考慮你的程序邏輯,真的。通常,API將而不是具有所有可選參數,您需要從所有輸入構建一個大型決策樹。

換句話說,在一個真實的程序中,您通常不會遇到一個函數,其中對於每個不同的輸入組合,行爲都完全不同。不變的是,即使對於大量的可選參數,合法組合也要小得多,甚至更小。

對於你的玩具例如,你可以想出其他的方法來創建你的回報價值不涉及一個決策樹:

  • 地圖對策:

    responsemap = { 
        (True, True, False): "a and b", 
        (True, False, True): "a and c", 
        (True, True, True): "a and b and c" 
    } 
    
    def Hello(a=None, b=None, c=None): 
        return responsemap.get((bool(a), bool(b), bool(c)), None) 
    
  • 構建基於字符串輸入:

    def Hello(a=None, b=None, c=None): 
        return ' and '.join([n for n in ('a', 'b', 'c') if locals()[n]]) 
    
+0

是的,你的權利。我應該重新考慮我的方法簽名,它會限制輸入的數量,但是要感謝您展示的不同方法 – user1741339

4

您需要重新排列if聲明:

def Hello(a=None, b=None, c=None): 
    if a and b and c: 
     return "a and b and c" 
    if a and b: 
     return "a and b" 
    if a and c: 
     return "a and c" 

a and b and c計算結果爲真,a and b也值爲true,那麼在你的代碼這種情況下得到由第一if處理。

+1

但我的目的是要避免所有不必要的循環如果可能 – user1741339

+2

@ user1741339:然後找出一個更好的API ..多久這是否會發生在現實生活中的軟件,真的嗎? –

+0

@ user1741339:'if'不啓動循環。 – Matthias