I want to call some unknown function with adding parameters using getattr function. Is it possible?
How to launch getattr function in python with additional parameters?
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)
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)
Thanks for the additional kwargs approach. –
Togo
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
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.