Python function as a function argument?
PythonFunctionArgumentsPython 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:
- Is it allowed at all?
- 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
- Yes, it's allowed.
- You use the function as you would any other:
anotherfunc(*extraArgs)
Solution 7 - Python
- 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.