質問

私は以下のような場合/ 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)

あなたは現在のモジュールで定義された関数をコールする場合。

それは醜いけど。私は辞書の溶液を使用すると思います。

私は以前に同じ問題が発生しました。私はあなたが探しているのだと思うものを、この質問を見てます。

辞書やif文

この希望が便利です。

EEF

以前のものからいくつかの変更:

funcs = {
'CONNECT': connect,
'RAWFEED': rawfeed,
'RAWCONFIG' : rawconfig,
'TESTFEED': testfeed
}

func = funcs.get('status')
if func:
    func(*args, **kwargs)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top