我有一个函数必须调用其他函数,并且参数的数量和类型不固定,我想将其设置在字典中。
类似这样的:
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'])
当然这不起作用,因为参数是字符串而不是实际变量。
我猜这个解决方案可能与命名元组有关,但我无法确切地弄清楚如何。
另外,我不确定这是否是一个好的做法,或者是否有更好的方法来实现相同的结果。
接近您的代码,这可能已经是您的解决方案。但是,我建议实际命名参数并使用 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"])