2016-08-23 82 views
0

我正在嘗試這個可以替代開關的小代碼。但我得到了我的錯誤。Python中的開關替代

def main(x): 

    x = x.split(' ') 
    return {'Function1' : Function1(x), 
      'Function2' : Function2(x), 
      }[x[0]] 


def Function1(x): 
    var1 = x[0] 
    var2 = x[1] 

def Function2(x): 
    print x[0] 

main("Function1 10") 

現在上面的代碼工作正常。問題是如果我傳遞Function2作爲鍵沒有任何參數主函數它會自動進入Function1並拋出列表超出範圍錯誤。

main("Function2") 

在此先感謝。

+0

在'Function2'你沒有定義任何變量'x'但你正在訪問它的第一個元素 – mirosval

+0

@mirosval它不會進入fun2本身。 – taz

+1

與字典相比,您可以做什麼與其他語言的常見開關語句不同。也許在你想要做什麼以及如何做什麼的時候提出問題。將值映射到函數可以通過映射(你在做什麼)來完成,不需要switch語句。 –

回答

3

您的代碼根本不起作用。您在定義字典時總是調用函數。你應該保持可調用的字典,並調用結果。

def main(x): 
    x = x.split(' ') 
    func = {'Function1' : Function1, 
      'Function2' : Function2, 
      }[x[0]] 
    return func(x[1]) 
+0

你寫的是真的,但這不適用於丟失的鍵(沒有「默認」)。此外,沒有跌倒的行爲(所以不能用於例如duff設備),這也值得一提。 –

+0

@Daniel但我不能將多個aruguments傳遞給我的函數使用此代碼。 – taz

+0

通過使用get而不是索引很容易實現默認行爲。例如func.get(x [0],Function3) – Tim

0

你真正應該做的是使用的if/elif/else語句的字符串:

if x == 1: 
    Function1() 
elif x == 2: 
    Function2() 
else: 
    Function3() 
+2

_should do_有點苛刻,使用映射而不是大量的ifs是有效的編程技術,並且在這樣的映射中存儲可調參數[Python中沒有什麼離譜](http://stackoverflow.com/questions/9205081/python-is-有-A-方式到店-A-功能在-A-列表或詞典那麼這-時)。 –

+0

取決於您有多少個案例以及它們需要動態變化。對於一些靜態的情況,這當然更具可讀性。現在OP有兩種情況不需要動態擴展,他沒有提到任何這些要求,所以推測簡單比複雜更好。 – mirosval

1

代碼塊

return {'Function1' : Function1(x), 
     'Function2' : Function2(x), 
     }[x[0]] 

首先會計算

return {'Function1' : Function1(x), 
     'Function2' : Function2(x), 
     } 

計算此將實際請致電Function1Function2

你需要的是獲得正確的函數的引用,而不實際調用它,直到你知道你要調用哪一個:

return {'Function1' : Function1, 
     'Function2' : Function2, 
     }[x[0]](x)