質問
私は以下のような場合/ else文を使用して対Pythonでの変数に基づいて機能を呼び出すためのより良い方法を探しています。各ステータスコードが対応する機能を有している
if status == 'CONNECT':
return connect(*args, **kwargs)
elif status == 'RAWFEED':
return rawfeed(*args, **kwargs)
elif status == 'RAWCONFIG':
return rawconfig(*args, **kwargs)
elif status == 'TESTFEED':
return testfeed(*args, **kwargs)
...
私は、これは
構文として、いくつかの工場機能の並べ替えが、わからないを必要とすると仮定します解決
これを行うための標準的な方法は、switch
またはif/elif
をエミュレートするために辞書を使用することです。あなたはここにSO上で同様の問題のいくつかの質問があります。
キーとしてのステータスコードで辞書にあなたの機能を置きます:
funcs = {
'CONNECT': connect,
'RAWFEED': rawfeed,
'RAWCONFIG' : rawconfig,
'TESTFEED': testfeed
}
funcs[status](*args, **kwargs)
他のヒント
あなたが見つけるかもしれない getattr
に便利な、私は推測します
import module
getattr(module, status.lower())(*args, **kwargs)
これらの機能は、いくつかのモジュールに属していると仮定します:
import module
return getattr(module, status.lower()).__call__(*args, **kwargs)
それはあなたが(私の意見よりエレガントな方法で)わずかに異なるにGETATTR使用することができ縫い目
import math
getattr(math, 'sin')(1)
や関数は、
以下のようにインポートされた場合from math import sin
あなたがでそれを呼び出すことができるようにの罪は、名前空間になりました
vars()['sin'](1)
SilentGhostの答えにいくつかの改善ます:
globals()[status.lower()](*args, **kwargs)
あなたは現在のモジュールで定義された関数をコールする場合。
それは醜いけど。私は辞書の溶液を使用すると思います。
これを見て: getattraとしての機能ディスパッチャする
以前のものからいくつかの変更:
funcs = {
'CONNECT': connect,
'RAWFEED': rawfeed,
'RAWCONFIG' : rawconfig,
'TESTFEED': testfeed
}
func = funcs.get('status')
if func:
func(*args, **kwargs)
所属していません StackOverflow