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.

Tim McJilton
  • 6,884
  • 6
  • 25
  • 27

2 Answers2

11

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
  • 249,864
  • 45
  • 407
  • 398
4

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 Z
  • 128,184
  • 27
  • 255
  • 279