Python中如何迭代调用不同函数(含带关键字参数的函数)
解决Python中迭代调用带参数函数的问题
我明白你现在卡在哪了——直接把带参数的函数调用写成字符串存起来,getattr根本没法处理这种格式,它只能帮你获取函数对象,解析不了字符串里的参数部分。下面给你几个实用的解决思路:
方法1:直接存储函数对象与参数的组合
这是最直观也最安全的方式,把每个需要调用的函数、位置参数、关键字参数打包成元组,迭代的时候直接解包调用:
import mymod if __name__ == '__main__': # 每个元素是 (函数对象, 位置参数列表, 关键字参数字典) function_tasks = [ (mymod.f1, [], {}), # 无参数调用 f1() (mymod.f1, [], {'keyword': True}),# 带关键字参数调用 f1(keyword=True) (mymod.f2, [], {}) # 无参数调用 f2() ] for func, args, kwargs in function_tasks: try: result = func(*args, **kwargs) print(result) except Exception as e: # Python 3不再支持 Exception, e 的写法,建议用这种标准格式捕获异常 print(f"调用函数时出错: {str(e)}")
方法2:存储函数名字符串(适用于动态场景)
如果因为某些原因你必须存储函数的名字(比如从配置文件读取),那可以把函数名和参数分开存储,再用getattr动态获取函数对象:
import mymod import sys # 获取当前模块对象 current_module = sys.modules[__name__] if __name__ == '__main__': # 调用外部模块(mymod)的函数 external_calls = [ ('f1', [], {}), ('f1', [], {'keyword': True}), ('f2', [], {}) ] for func_name, args, kwargs in external_calls: try: # 从mymod中获取函数对象 func = getattr(mymod, func_name) result = func(*args, **kwargs) print(result) except AttributeError: print(f"mymod中不存在名为{func_name}的函数") except Exception as e: print(f"调用{mymod.__name__}.{func_name}出错: {str(e)}") # 调用当前模块的函数 local_calls = [ ('f1', [], {}), ('f2', [], {}) ] for func_name, args, kwargs in local_calls: try: func = getattr(current_module, func_name) result = func(*args, **kwargs) print(result) except AttributeError: print(f"当前模块中不存在名为{func_name}的函数") except Exception as e: print(f"调用当前模块.{func_name}出错: {str(e)}")
为什么你原来的方法行不通?
你写的'mymod.f1(keyword=True)'是一个完整的字符串,getattr(mymod, func)会试图在mymod模块里找一个**名字就是f1(keyword=True)**的函数——显然不存在这个函数,所以必然会抛出AttributeError。正确的思路是把「函数」和「参数」拆分开,分别传递给调用逻辑。
另外注意:Python 3已经废弃了except Exception, e这种写法,换成except Exception as e才是标准用法哦。
内容的提问来源于stack exchange,提问作者simona
相关产品推荐
相关产品推荐

