Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python using getattr to call function with variable parameters

I'm using getattr to call different functions depending on a variable.

Im doing something like that:

getattr(foo, bar) () 

That works, calling functions like foo.bar()

My problem is that I have 'bar' functions and I want to call it with different parameters. For example:

def f1() :   pass  def f2(param1) :   pass  def f3(param1,param2) :   pass 

so 'bar' could be f1, f2, or f3

I tried this: assumming that params is a list which contains all parameters needed for the 'bar' function

getattr(foo, bar) (for p in params :) 

I watching for a "clean" solution, with no needed to watch the length on the params variable

like image 455
lcorral Avatar asked Aug 02 '12 15:08

lcorral


People also ask

How many arguments does Getattr function receive?

getattr() is one of the coolest built-in functions in Python. It takes three arguments: an object. name of the object's attribute but in the string format.

Is Getattr () used for?

The getattr() function returns the value of the specified attribute from the specified object.

Why Getattr is used in Python?

The Python getattr() function is used to obtain an object's attribute value and also provides the option of executing the default value if the attribute is not available.


2 Answers

This is very simple in Python 3. Here is the example:

class C:     def __init__(self, name, age):         self.name = name         self.age = age      def m(self, x):         print(f"{self.name} called with param '{x}'")         return  ci = C("Joe", 10) print(C) print(ci) print(C.m) print(ci.m) print(getattr(ci,'m')) getattr(ci,'m')('arg') 

<class '__main__.C'> <__main__.C object at 0x000001AF4025FF28> <function C.m at 0x000001AF40272598> <bound method C.m of <__main__.C object at 0x000001AF4025FF28>> <bound method C.m of <__main__.C object at 0x000001AF4025FF28>> Joe called with param 'arg' 

Note that getattr is from the builtins module, takes in our case the two parameters, the class instance ci and the string representing the name of the function.

We could also define the defult value for the parameter.

def m(self, x=None):     print(f"{self.name} caled with param '{x}'")     return 

In which case we may call:

getattr(ci,'m')() 
like image 30
prosti Avatar answered Sep 20 '22 17:09

prosti


You could try something like:

getattr(foo, bar)(*params) 

This works if params is a list or a tuple. The elements from params will be unpacked in order:

params=(1, 2) foo(*params) 

is equivalent to:

params=(1, 2) foo(params[0], params[1]) 

If there are keyword arguments, you can do that too.

getattr(foo, bar)(*params, **keyword_params) 

where keyword_params is a dictionary.

Also, This answer is really independent of getattr. It will work for any function/method.

like image 137
mgilson Avatar answered Sep 19 '22 17:09

mgilson