使用Python exec调用带对象参数的函数时遇SyntaxError问题求助
解决动态调用测试函数时的SyntaxError问题
问题重现
尝试通过exec动态调用接收对象参数的函数,代码如下:
exec(f"{object.attr1}.{object.attr2}({interface_obj})")
运行时触发语法错误:
SyntaxError: invalid syntax
具体错误指向interface_obj位置,完整错误提示:
test1.test_func(<__main__.TEST object at 0x000002962BF83FD0>) ^ SyntaxError: invalid syntax
背景
开发自动化测试平台,目录结构如下:
main.py .\Main_dependency |__ test_calling_script.py .\Test |__ test1.py |__ test2.py : |__ testN.py
需求是在test_calling_script.py中统一导入测试模块,根据输入动态执行对应测试函数,最初采用exec实现单行调用导致错误。
正确解决方案
放弃使用exec,改用importlib动态导入模块结合getattr获取函数的方式,完全规避字符串拼接带来的语法问题。
通用用法
from importlib import import_module # 动态导入目标模块并获取函数 target_func = getattr(import_module('包名.测试文件名'), '函数名') # 调用函数并传入参数 target_func(传入的参数)
适配当前场景的代码
from importlib import import_module # 动态导入Test目录下的指定测试模块 test_module = import_module(f'Test.{object.attr1}') # 从模块中获取要执行的测试函数 test_func = getattr(test_module, object.attr2) # 执行函数并传入interface_obj参数 test_func(interface_obj)
注:原解决方案代码中
getattr的第二个参数多了不必要的大括号,已修正为直接传入属性值。
类似场景说明
动态导入模块成员(类/函数)时,优先使用importlib+getattr的组合方案,相比exec更安全、更易维护,也能避免字符串解析带来的语法错误。
内容的提问来源于stack exchange,提问作者pedru
相关产品推荐
相关产品推荐

