You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python元编程:间接赋值函数名时函数解析失败的排查与解决

错误原因

你遇到的问题核心是类型不匹配:defs('sum').name[0]返回的是字符串'sum',但makeCall要求传入的是函数对象本身,不是函数名字的字符串。你用的cast(s, FUNCTIONDEF)只是给静态类型检查器的提示,Python运行时根本不会改变变量的实际类型,所以字符串还是字符串,自然过不了参数校验。

解决方法

要把函数名字符串转换成对应的函数对象,得从函数所在的命名空间里去获取,常见的几种方式:

  1. 获取内置函数
    内置函数(比如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
  1. 获取自定义函数/当前作用域内的函数
    如果是你自己定义的函数,同样可以用globals()(全局作用域)或者locals()(局部作用域)来获取:
def my_func(a, b):
    return a + b

func_name = "my_func"
s = locals()[func_name]  # 或者globals(),看函数所在作用域
makeCall(s, [2,3])  # 返回5
  1. 获取模块中的函数
    如果函数来自某个模块,先导入模块,再用getattr获取:
import math

func_name = "sqrt"
s = getattr(math, func_name)
makeCall(s, [4])  # 返回2.0

内容的提问来源于stack exchange,提问作者Shilin Wang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 10:16:07