Cool Javelin
Cool Javelin

Reputation: 782

Python call a function by indirection

Windows7, Python2.7 MPD2.

I am writing a program to control MPD.

MPD has several (over 50) different functions.

Normally one would make a call in the form:

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

I want to encapsulate all the separate calls in one function so I can use a single try / except.

I am thinking I want to use some sort of lambda, and *args but I have little experience with either of those.

In the body of my program, I want to call something like this:

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

I envision my function looking something like...

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

of course, this isn't working.

Short of writing a huge switch statement and 50 different try structures, is there a way I can use lambda?

maybe something like:

lambda m=mpd_client.required_param: m(args)

but, this isn't working either.

I don't know.

Thanks, Mark.

Upvotes: 0

Views: 396

Answers (2)

Tianjin Gu
Tianjin Gu

Reputation: 784

what you need is object.__dict__, as in your code:

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

Upvotes: 0

Amber
Amber

Reputation: 526593

You need to use getattr() to retrieve the actual method to call by name:

getattr(mpd_client, required_param)(*args)

(Note that you also need the * in front of the args for the function call as well, to re-expand the argument list back into separate arguments.)

Upvotes: 2

Related Questions