Python元编程:间接赋值函数名时函数解析失败的排查与解决
错误原因
你遇到的问题核心是类型不匹配:defs('sum').name[0]返回的是字符串'sum',但makeCall要求传入的是函数对象本身,不是函数名字的字符串。你用的cast(s, FUNCTIONDEF)只是给静态类型检查器的提示,Python运行时根本不会改变变量的实际类型,所以字符串还是字符串,自然过不了参数校验。
解决方法
要把函数名字符串转换成对应的函数对象,得从函数所在的命名空间里去获取,常见的几种方式:
- 获取内置函数
内置函数(比如sum)存在全局命名空间或者__builtins__模块里,直接通过名字索引即可:
func_name = defs('sum').name[0] # 方法1:从全局命名空间获取 s = globals()[func_name] # 方法2:从__builtins__获取 s = getattr(__builtins__, func_name) makeCall(s, [1,2,3]) # 正常返回6
- 获取自定义函数/当前作用域内的函数
如果是你自己定义的函数,同样可以用globals()(全局作用域)或者locals()(局部作用域)来获取:
def my_func(a, b): return a + b func_name = "my_func" s = locals()[func_name] # 或者globals(),看函数所在作用域 makeCall(s, [2,3]) # 返回5
- 获取模块中的函数
如果函数来自某个模块,先导入模块,再用getattr获取:
import math func_name = "sqrt" s = getattr(math, func_name) makeCall(s, [4]) # 返回2.0
内容的提问来源于stack exchange,提问作者Shilin Wang
相关产品推荐
相关产品推荐

