2016-12-20 24 views
0

Windows7、Python2.7 MPD2。Pythonは間接的に関数を呼び出します

私はMPDを制御するプログラムを書いています。

MPDには、複数の(50以上の)異なる機能があります。

通常1フォームで電話をかけるでしょう。

mpd_client.pause() 
#or 
mpd_client.playlistmove(playlist_name, old_pos, new_pos) 

私は除き/単一のtryを使用できるように、一つの関数内のすべての個別の呼び出しをカプセル化します。

私はある種のラムダと* argsを使いたいと思っていますが、私はどちらかの経験がほとんどありません。

もちろんの
def MPD(required_param, *args): 
    try: 
     mpd_client.required_param(args) 
    except: 
     ... 

、これではありません...

MPD('pause') 
#or 
MPD('playlistmove', playlist_name, old_pos, new_pos) 

は、私のようなものを見て、私の機能を想像:私のプログラムの本体で

は、私はこのような何かを呼びたいですワーキング。

巨大なswitch文と50個の異なるtry構造を書くのは簡単ですが、ラムダを使う方法はありますか?

多分何か:

lambda m=mpd_client.required_param: m(args) 

しかし、これはどちらか動作していません。

わかりません。

ありがとうございました。あなたが名前で呼び出すために実際のメソッドを取得するためにgetattr()を使用する必要が

答えて

2

getattr(mpd_client, required_param)(*args) 

(再展開するだけでなくあなたも、関数呼び出しのためargsの前に*が必要であることに注意してください。戻って別の引数に引数リスト)

+0

ありがとうアンバー、これは私が必要としていたものです。 –

0

あなたが必要なものは、オブジェクト.__ dict__に、あなたのコードのようです:

func = mpd_client.__dict__['pause'] 
func() 
func = mpd_client.__dict__['playlistmove'] 
func(playlist_name, old_pos, new_pos) 
関連する問題