Python动态调用函数及高效传递参数的实现方法
推荐问题标题:Python 动态调用指定函数并批量传递公共参数的实现方案
方案1:匹配你设想的参数封装实现
你设想的传参模式可以通过SimpleNamespace把字典转为支持属性访问的对象,再配合函数映射表实现无硬编码判断的调用:
首先导入所需工具:
from types import SimpleNamespace
然后维护一个函数名到实际函数对象的映射表,后续新增函数只需要在这个表中添加对应关系即可:
func_map = { "some_function": some_function, "another_function": another_function }
循环调用的逻辑实现如下:
for arguments in argument_list: # 获取目标函数 current_func = func_map[arguments["function"]] # 取出待遍历的名称列表 name_list = arguments.pop("names") # 遍历每个名称执行调用 for name in name_list: # 合并名称和其他固定参数,转为属性访问对象 param = SimpleNamespace(name=name, **arguments) current_func(param)
这个方案完全匹配你设想的函数内部用param.属性名取值的写法,不需要修改你已经写好的函数定义。
方案2:更轻量化的参数解包实现
如果你不需要强制把参数封装为单对象,可以用位置参数解包的方式,连原函数定义都不需要修改:
首先调整参数列表结构,直接把函数对象、待遍历名称、固定参数分开存储:
argument_list = [ {"func": some_function, "names": ["first", "second"], "fixed_args": (1, 2)}, {"func": another_function, "names": ["first"], "fixed_args": (3, 1, 5)} ]
调用逻辑只需要两行循环即可完成:
for item in argument_list: for name in item["names"]: item["func"](name, *item["fixed_args"])
该方案后续新增函数时,只需要在参数列表中添加对应配置项即可,不需要额外维护映射表,代码量更低。
内容的提问来源于stack exchange,提问作者Paul Brink
相关产品推荐
相关产品推荐

