rul3s
rul3s

Reputation: 342

Can I use a function passed by parameters?

I have a function, and inside this function I should execute another function of 3 posibilities.

The simple way should be passing a parameter, doing a if-elif to exec function acording to that parameter, but I'd like to know it it's posible to pass the name of a funtion by params and use that, something like:

FunctionA(Param1, Param2, FunctionNameToUse)
    ....Code....
    FunctionNameToUse(Value1, Value2)
    ....Code....
endFunctionA

Depending on how functionA is called, it will use one Function or another, I dont know if I explained well...

Thanks mates!

Upvotes: 1

Views: 53

Answers (3)

oxymor0n
oxymor0n

Reputation: 1097

Yes, you can. As other have mentioned, functions are first-class objects, i.e. you can do everything you can think of to it (see What are "first class" objects? for more info).

So then, how does this really work when you pass in a function as parameter? If you have taken any ComSci class, you'd know that each process has a special area in memory allocated for its code; all of your functions are defined here. Whenever you call a function, the CPU would move the Program Counter (a special pointer that points to whatever code it is executing at the moment) to the beginning of that function's code, and go from there. Thus, after the function is loaded in memory, all that's needed to call it is its address. When you pass a function A's "name" as an argument to another function B in Python, what you are doing is really passing a reference (in C term, a pointer) that contains the address to the code that represents A in memory.

Upvotes: -1

Daniel Roseman
Daniel Roseman

Reputation: 599480

Functions themselves are first class objects in Python. So there's no need to pass the name: pass the actual function itself, then you can call it directly.

def func1(a, b):
    pass

def func2(a, b):
    pass

def functionA(val1, val2, func):
    func(val1, val2)

# now call functionA passing in a function
functionA("foo", "bar", func1)

Upvotes: 3

Christophe Biocca
Christophe Biocca

Reputation: 3468

In python, functions are first-class values, which means they can be passed around as arguments, returned from functions, and so on.

So the approach you want to take should work (However you're not passing the name, you're passing the actual function).

Take a look at map and filter in the standard library, they do exactly this.

Upvotes: 0

Related Questions