Python通过间接调用函数

时间:2016-12-20 05:55:30

标签: python lambda

Windows7,Python2.7 MPD2。

我正在编写一个控制MPD的程序。

MPD有几个(超过50个)不同的功能。

通常情况下,人们会以下列形式打电话:

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

我想在一个函数中封装所有单独的调用,所以我可以使用一个try / except。

我在想我想使用某种lambda和* args,但我对这两种方法都没什么经验。

在我的程序正文中,我想打电话给这样的话:

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

我设想我的功能看起来像......

def MPD(required_param, *args):
    try:
        mpd_client.required_param(args)
    except:
        ...

当然,这不起作用。

如果没有编写一个巨大的switch语句和50个不同的try结构,有没有办法可以使用lambda?

可能是这样的:

lambda m=mpd_client.required_param: m(args)

但是,这也不起作用。

我不知道。

谢谢,Mark。

2 个答案:

答案 0 :(得分:2)

您需要使用getattr()来检索按名称调用的实际方法:

getattr(mpd_client, required_param)(*args)

(请注意,对于函数调用,您还需要*前面的args,将参数列表重新展开为单独的参数。)

答案 1 :(得分:0)

你需要的是对象.__ dict__,就像你的代码一样:

func = mpd_client.__dict__['pause']
func()
func = mpd_client.__dict__['playlistmove']
func(playlist_name, old_pos, new_pos)