Python如何通过字符串名称动态调用模块内的对应函数?
错误原因
你的代码报错核心是两处写法错误:
module.list[x]()的逻辑是尝试访问module模块下名为list的属性,但你定义的存储函数名的list是当前文件的局部变量,不属于module模块的成员,自然触发"module has no attribute list"错误。- 列表本身仅支持整数下标索引,你循环中拿到的元素是字符串类型的函数名,就算直接写
list[x]也会触发类型错误。 - 额外提醒:不要用
list作为自定义变量名,它是Python内置列表类型的保留字,会覆盖内置能力埋下隐患。
正确实现方案
通过字符串名称获取对象(模块也是一种对象)的成员,直接用Python内置的getattr()函数即可,该函数接收对象、成员名字符串两个核心参数,返回对应的成员对象。
修正后的调用代码:
import module # 包含x()、y()、z()三个函数的自定义模块 func_name_list = ['x','y','z'] for func_name in func_name_list: current_func = getattr(module, func_name) current_func()
运行后会依次执行三个函数,输出x、y、z。
鲁棒性增强写法
如果存在函数名不在模块内的可能,可以给getattr传入第三个默认值参数,搭配callable()校验避免程序崩溃:
import module func_name_list = ['x','y','z', 'test_non_exist'] for func_name in func_name_list: current_func = getattr(module, func_name, None) if callable(current_func): current_func() else: print(f"模块中不存在名为{func_name}的可调用函数")
内容的提问来源于stack exchange,提问作者Brecht Corbeel
相关产品推荐
相关产品推荐

