2017-04-19 34 views
0

我嘗試在Python中實現開關/外殼機制。在閱讀了幾個網站和問題後(例如this one),我構建了下面的代碼。但它的行爲是錯誤的,具有我所理解的 - 一個可以是problematic to get的轉折,當然不是默認的預期結果。在Python字典中翻譯替換開關/外殼

def something(): 
    print 'something' 

def somethingElse(): 
    print 'something else' 

def switch(): 
    cases = { 
     0: something(), 
     1: something(), 
     2: something(), 
     3: something(), 
     4: something(), 
     5: something() 
     } 

    cases.get(2, somethingElse()) 

switch() 

(顯然,對於每一種情況下相同的開關僅僅是用於示例的目的)

當我運行它,我期望something()要只運行一次(如我手動輸入2)。但是,控制檯中的輸出爲:

something 
something 
something 
something 
something 
something 
something else 

這意味着它運行了6次加上默認值運行。我不明白在這個代碼中允許這樣一個轉折嗎?或者問題可能不同?

這是Python 2.7.12這裏。

回答

1

您的字典在創建案例時會調用每一個函數。你的函數打印(副作用),而不是返回一個字符串,所以你看到所有打印到控制檯的字符串。

而是,您的交換機應該返回一個函數,然後您可以調用該函數。

def something(): 
    print 'something' 

def somethingElse(): 
    print 'something else' 

def switch(): 
    cases = { 
     0: something, 
     1: something, 
     2: something, 
     3: something, 
     4: something, 
     5: something 
     } 

    # All of the values in `cases` are functions so it is safe 
    # to call whatever `cases.get(...)` returns. 
    cases.get(2, somethingElse)() 

switch() 
+0

謝謝錯誤是明顯在'()'應該是運行一個函數的地方。謝謝你方的意見,我會糾正這些。 – adamczi

1

您需要返回函數名稱,然後調用它。像這樣

def something(): 
    print ('something') 

def somethingElse(): 
    print ('something else') 

cases = {1: something, 2: something, 3:something, 4:something,5:something} 
result = cases.get(2, somethingElse)() 

+0

謝謝你,你是對的,但我猜@ supersam654更快! – adamczi