How to launch getattr function in python with additional parameters?
Asked Answered
C

3

45

I want to call some unknown function with adding parameters using getattr function. Is it possible?

Context answered 12/6, 2011 at 12:30 Comment(0)
S
91

Yes, but you don't pass them to getattr(); you call the function as normal once you have a reference to it.

getattr(obj, 'func')('foo', 'bar', 42)
Semicircle answered 12/6, 2011 at 12:32 Comment(0)
C
61

If you wish to invoke a dynamic method with a dynamic list of arguments / keyword arguments, you can do the following:

function_name = 'wibble'
args = ['flip', 'do']
kwargs = {'foo':'bar'}

getattr(obj, function_name)(*args, **kwargs)
Caruthers answered 12/6, 2011 at 13:10 Comment(1)
Thanks for the additional kwargs approach.Togo
D
-2

function to call

import sys

def wibble(a, b, foo='foo'):
    print(a, b, foo)
    
def wibble_without_kwargs(a, b):
    print(a, b)
    
def wibble_without_args(foo='foo'):
    print(foo)
    
def wibble_without_any_args():
    print('huhu')


# have to be in the same scope as wibble
def call_function_by_name(function_name, args=None, kwargs=None):
    if args is None:
        args = list()
    if kwargs is None:
        kwargs = dict()
    getattr(sys.modules[__name__], function_name)(*args, **kwargs)

    
call_function_by_name('wibble', args=['arg1', 'arg2'], kwargs={'foo': 'bar'})
call_function_by_name('wibble_without_kwargs', args=['arg1', 'arg2'])
call_function_by_name('wibble_without_args', kwargs={'foo': 'bar'})
call_function_by_name('wibble_without_any_args')
# output:
# arg1 arg2 bar
# arg1 arg2
# bar
# huhu
Dactylo answered 15/11, 2020 at 10:42 Comment(4)
Don't set empty lists or dicts in the function declaration since they are evaluated immediately.Anticipative
@SunnyPatel: Don't agree. With the empty list and dict declaration, the call_function_by_name is more universal. You can call functions without kwargs, args or even without any arguments. I modified my answer to make this clear.Dactylo
@mGran, Sunny is pointing out that doing this is specifically an anti-pattern. There are many discussions on why setting an instance of an empty list/dict/etc in a function declaration doesn't do what many people think it will do, and why it will bite you. I'd suggest taking a look at some of those discussions. e.g. #26321399 or #1133441 to make sure you understand the implications of doing this.Wayfaring
@Wayfaring You have got a point. I edited the answer.Dactylo

© 2022 - 2024 — McMap. All rights reserved.