Python3:如何通过变量拼接字符串调用函数?解决TypeError报错
解决字符串转函数调用的问题
你的错误原因很明确:function_call是拼接出来的字符串,而不是实际的函数对象,字符串类型不能被当作函数调用,所以抛出TypeError: 'str' object is not callable。
要实现你想要的“通过字符串找到对应函数并调用”的逻辑,可以借助Python的命名空间字典来实现,具体有两种常用方式:
方法一:使用全局命名空间字典globals()
如果你的get_list1、get_list2、get_list3是全局函数,可以通过globals()获取全局作用域中的函数对象:
def get_list1(): print("执行get_list1") def get_list2(): print("执行get_list2") def get_list3(): print("执行get_list3") data = ['list1', 'list2', 'list3'] for list_item in data: function_name = 'get_' + list_item # 从全局命名空间中取出对应函数 target_func = globals().get(function_name) # 先判断函数是否存在且可调用,避免报错 if target_func and callable(target_func): target_func() else: print(f"不存在可调用的函数: {function_name}")
globals()返回一个包含当前全局所有变量、函数的字典,键是名称字符串,值是对应的对象,所以可以通过拼接好的函数名字符串作为键,取出真正的函数对象,之后就能正常调用了。
方法二:使用局部命名空间字典locals()
如果你的函数是定义在某个局部作用域内(比如另一个函数内部),就用locals()代替globals(),用法完全一致:
def main(): def get_list1(): print("执行get_list1") def get_list2(): print("执行get_list2") def get_list3(): print("执行get_list3") data = ['list1', 'list2', 'list3'] for list_item in data: function_name = 'get_' + list_item target_func = locals().get(function_name) if target_func and callable(target_func): target_func() main()
额外提示
虽然这种字符串转函数的方式能实现需求,但实际开发中更推荐用字典映射的方式(你提到的其他思路),代码可读性和安全性更高:
def get_list1(): print("执行get_list1") def get_list2(): print("执行get_list2") def get_list3(): print("执行get_list3") func_map = { 'list1': get_list1, 'list2': get_list2, 'list3': get_list3 } data = ['list1', 'list2', 'list3'] for list_item in data: func = func_map.get(list_item) if func: func()
内容的提问来源于stack exchange,提问作者rogueakula
相关产品推荐
相关产品推荐

