在实际调用之外定义函数的参数

问题描述 投票:0回答:1

我有一个函数必须调用其他函数,并且参数的数量和类型不固定,我想将其设置在字典中。

类似这样的:

def main_function(list_of_subfunctions_to_call):

    functions_to_call = {'fcname1': {'method': 'fc1', 'args': ('var1')}, 
                         'fcname2': {'method': 'fc2', 'args':('var2', 'var3')}}

    var1 = None
    var2 = None
    var3 = None

    for fc in list_of_subfunctions_to_call:
        functions_to_call[fc]['method'](fc['args'])

当然这不起作用,因为参数是字符串而不是实际变量。

我猜这个解决方案可能与命名元组有关,但我无法确切地弄清楚如何。

另外,我不确定这是否是一个好的做法,或者是否有更好的方法来实现相同的结果。

python namedtuple
1个回答
0
投票

接近您的代码,这可能已经是您的解决方案。但是,我建议实际命名参数并使用 kwargs(关键字参数),如第二个代码片段中提供的。


def fun1(arg1):
    print(arg1)

def fun2(arg2, arg3):
    print(arg2, arg3)

var1 = "hello"
var2 = "world"
var3 = "!"

functions_to_call = {'fcname1': {'method': fun1, 'args': (var1,)}, 'fcname2': {'method': fun2, 'args':(var2, var3)}}


for fc in functions_to_call.keys():
    print("executing ", fc)
    functions_to_call[fc]['method'](*functions_to_call[fc]["args"])

注意,这里的参数作为字典传递,并使用

**
表示法解包,这将它们作为函数的键(参数名称)值对提供。这样,确保参数的正确顺序就不再重要了。

def fun1(arg1):
    print(arg1)

def fun2(arg2, arg3):
    print(arg2, arg3)

var1 = "hello"
var2 = "world"
var3 = "!"

functions_to_call = {
    'fcname1': {
        'method': fun1, 'args': {"arg1": var1}
    },
    'fcname2': {
        'method': fun2, 'args': {"arg2": var2, "arg3": var3}
    }
}


for fc in functions_to_call.keys():
    print("executing ", fc)
    functions_to_call[fc]['method'](**functions_to_call[fc]["args"])

© www.soinside.com 2019 - 2024. All rights reserved.