views:

56

answers:

2

So I know that you can wrap a function around another function by doing the following.

def foo(a=4,b=3):
   return a+b
def bar(func,args):
   return func(*args)

so if I then called

bar(foo,[2,3])

the return value would be 5.

I am wondering is there a way to use bar to call foo with foo(b=12) where bar would return 16?

Does this make sense? Thank you so much for your time ahead of time! And sorry for asking so many questions.

+7  A: 

This requires the **kwargs (keyword arguments) syntax.

def foo(a=4, b=3):
    return a+b
def bar(func, *args, **kwargs):
    return func(*args, **kwargs)

print bar(foo, b=12) # prints 16

Where *args is any number of positional arguments, **kwargs is all the named arguments that were passed in.

And of course, they are only *args and **kwargs by convention; you could name them *panda and **grilled_cheese for all Python cares.

Mark Rushakoff
Thanks Mark! That is perfect, exactly what I needed!
Tim McJilton
+4  A: 

Yep, you can also pass a dict in addition to (or instead of) the list:

def bar(func, args=[], kwargs={}):
    return func(*args, **kwargs)

bar(foo, {'b':12})
David Zaslavsky