2016-08-23 3 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") 

上記のコードは正常に動作します。問題は、もし私がFunction1を主関数に引数なしでキーとして渡すと、自動的にFunction1に入り、範囲外のエラーをスローします。

main("Function2") 

ありがとうございました。

+0

あなたが任意の変数 'X'を定義していませんでしたが、あなたはその第1要素にアクセスしています – mirosval

+0

@mirosvalそれはfun2自体には入りません。 – taz

+1

他の言語の一般的なswitch文とは異なり、辞書でできることとはいくつか違いがあります。おそらくあなたがやろうとしていることとその方法に疑問を投げかけてください。関数への値のマッピングは、マッピング(あなたがやっていることの並べ替え)で行うことができ、switch文は必要ありません。 –

答えて

3

コードがまったく機能しません。あなたはdictを定義するときには常に関数を呼び出します。あなたはdictにcallableを保持し、結果を呼び出す必要があります。あなたが本当に何をすべき

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

あなたが書いたWhayは真ですが、これは欠けているキーには機能しません(「デフォルト」はありません)。また、言及する価値のある落書きのような振る舞いはありません(たとえば、ダフ・デバイスには使用できません)。 –

+0

@Danielしかし、私はこのコードを使って私の関数に複数の警告を渡すことはできません。 – 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-そういう意味での機能をリストまたは辞書に格納することができます。 –

+0

あなたが持っているか、より多くの場合、どれが動的である必要があるかによって異なります。いくつかの静的なケースでは、これは確かにはるかに読みやすくなります。今OPには動的に拡張する必要のない2つのケースがあり、これらの要件は言及されていないため、おそらく単純なものは複雑なものより優れています。 – mirosval

1

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

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

として最初に評価されたコードブロックはこれを評価します実際のFunction1Function2の両方を呼び出してください。何をしたい

はあなたが呼び出したいどの1知るまでは、実際にそれを呼び出すことなく、正しい関数への参照を取得することです:Function2` `で

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