【发布时间】:2011-09-13 09:31:42
【问题描述】:
我想通过 getattr 函数添加参数来调用一些未知函数。有可能吗?
【问题讨论】:
我想通过 getattr 函数添加参数来调用一些未知函数。有可能吗?
【问题讨论】:
是的,但你不要将它们传递给getattr();一旦你引用了这个函数,你就可以正常调用它。
getattr(obj, 'func')('foo', 'bar', 42)
【讨论】:
如果您希望使用参数/关键字参数的动态列表调用动态方法,您可以执行以下操作:
function_name = 'wibble'
args = ['flip', 'do']
kwargs = {'foo':'bar'}
getattr(obj, function_name)(*args, **kwargs)
【讨论】:
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
【讨论】: