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