如何在Python中带附加参数调用getattr函数?

45 投票
3 回答
36403 浏览
提问于 2025-04-16 19:25

我想用一个叫做getattr的函数来调用一个不知道具体是什么的函数,并且还想给它加上一些参数。这可能吗?

3 个回答

-2

要调用的函数

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
61

如果你想用一组动态的参数或者关键字参数来调用一个动态的方法,可以这样做:

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

getattr(obj, function_name)(*args, **kwargs)
91

是的,但你并不是把它们传给 getattr();一旦你有了对这个函数的引用,就像平常一样直接调用这个函数。

getattr(obj, 'func')('foo', 'bar', 42)

撰写回答