Python function as a function argument?

PythonFunctionArguments

Python Problem Overview


Can a Python function be an argument of another function?

Say:

def myfunc(anotherfunc, extraArgs):
    # run anotherfunc and also pass the values from extraArgs to it
    pass

So this is basically two questions:

  1. Is it allowed at all?
  2. And if it is, how do I use the function inside the other function? Would I need to use exec(), eval() or something like that? Never needed to mess with them.

BTW, extraArgs is a list/tuple of anotherfunc's arguments.

Python Solutions


Solution 1 - Python

> Can a Python function be an argument > of another function?

Yes.

def myfunc(anotherfunc, extraArgs):
    anotherfunc(*extraArgs)

To be more specific ... with various arguments ...

>>> def x(a,b):
...     print "param 1 %s param 2 %s"%(a,b)
...
>>> def y(z,t):
...     z(*t)
...
>>> y(x,("hello","manuel"))
param 1 hello param 2 manuel
>>>

Solution 2 - Python

Here's another way using *args (and also optionally), **kwargs:

def a(x, y):
  print x, y

def b(other, function, *args, **kwargs):
  function(*args, **kwargs)
  print other

b('world', a, 'hello', 'dude')

Output

hello dude
world

Note that function, *args, **kwargs have to be in that order and have to be the last arguments to the function calling the function.

Solution 3 - Python

Functions in Python are first-class objects. But your function definition http://docs.python.org/tutorial/controlflow.html#unpacking-argument-lists">is a bit off.

def myfunc(anotherfunc, extraArgs, extraKwArgs):
  return anotherfunc(*extraArgs, **extraKwArgs)

Solution 4 - Python

Sure, that is why python implements the following methods where the first parameter is a function:

  • map(function, iterable, ...) - Apply function to every item of iterable and return a list of the results.
  • filter(function, iterable) - Construct a list from those elements of iterable for which function returns true.
  • reduce(function, iterable[,initializer]) - Apply function of two arguments cumulatively to the items of iterable, from left to right, so as to reduce the iterable to a single value.
  • lambdas

Solution 5 - Python

Function inside function: we can use the function as parameter too..

In other words, we can say an output of a function is also a reference for an object, see below how the output of inner function is referencing to the outside function like below..

def out_func(a):

  def in_func(b):
       print(a + b + b + 3)
  return in_func

obj = out_func(1)
print(obj(5))

the result will be.. 14

Hope this helps.

Solution 6 - Python

  1. Yes, it's allowed.
  2. You use the function as you would any other: anotherfunc(*extraArgs)

Solution 7 - Python

  1. Yes. By including the function call in your input argument/s, you can call two (or more) functions at once.

For example:

def anotherfunc(inputarg1, inputarg2):
    pass
def myfunc(func = anotherfunc):
    print func

When you call myfunc, you do this:

myfunc(anotherfunc(inputarg1, inputarg2))

This will print the return value of anotherfunc.

Hope this helps!

Solution 8 - Python

Decorators are very powerful in Python since it allows programmers to pass function as argument and can also define function inside another function.

def decorator(func):
      def insideFunction():
        print("This is inside function before execution")
        func()
      return insideFunction
  
def func():
    print("I am argument function")
  
func_obj = decorator(func) 
func_obj()

Output

  • This is inside function before execution
  • I am argument function

Solution 9 - Python

def x(a):
    print(a)
    return a

def y(a):
    return a

y(x(1))

Solution 10 - Python

def x(a):
    print(a)
    return a

def y(func_to_run, a):
    return func_to_run(a)

y(x, 1)

That I think would be a more proper sample. Now what I wonder is if there is a way to code the function to use within the argument submission to another function. I believe there is in C++, but in Python I am not sure.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questiona7664View Question on Stackoverflow
Solution 1 - PythonManuel SalvadoresView Answer on Stackoverflow
Solution 2 - PythonsabujpView Answer on Stackoverflow
Solution 3 - PythonIgnacio Vazquez-AbramsView Answer on Stackoverflow
Solution 4 - PythonArtsiom RudzenkaView Answer on Stackoverflow
Solution 5 - PythonTemizziView Answer on Stackoverflow
Solution 6 - Pythonsepp2kView Answer on Stackoverflow
Solution 7 - PythonArialView Answer on Stackoverflow
Solution 8 - PythonUsman GaniView Answer on Stackoverflow
Solution 9 - PythonRichard Hayman-JoyceView Answer on Stackoverflow
Solution 10 - PythonBoris EpsteinView Answer on Stackoverflow