2017-04-19 33 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