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

如何根据给定的函数名称在运行时调用对应的函数?

Python运行时动态调用同签名函数的实现方案

方案1:字典映射(生产环境首选)

将所有可用函数预先注册到字典中,键为函数名的字符串形式,值为函数对象本身,是最安全可控的方案。

def add(a, b):
    return a + b

def mix(a, b):
    return a * b

def sub(a, b):
    return a - b

def xor(a, b):
    return a ^ b

# 注册所有允许动态调用的函数
blend_func_map = {
    "add": add,
    "mix": mix,
    "sub": sub,
    "xor": xor
}

def run(func_name, a, b):
    # 校验函数是否在允许调用的范围内
    if func_name not in blend_func_map:
        raise ValueError(f"不存在名为 {func_name} 的合法处理函数")
    # 调用对应函数并返回结果
    return blend_func_map[func_name](a, b)

# 实际使用示例
blend_name = "add"
# 注意input返回的是字符串,需要根据实际业务转成对应类型,比如int
a = int(input("Some input"))
b = int(input("Some other input"))
result = run(blend_name, a, b)
print(result)

该方案的优势:

  • 完全可控,只有提前注册的函数才会被调用,不存在恶意代码执行风险
  • 维护简单,新增函数只需要在字典中增加一条注册项即可
  • 查找效率高,字典查询时间复杂度为O(1)

方案2:命名空间查找(仅测试场景推荐)

可以直接从全局/局部命名空间中获取函数对象,无需手动维护字典,但存在安全风险,禁止在有用户输入的生产环境使用。

def run(func_name, a, b):
    # 从全局命名空间获取对应名称的对象
    target_func = globals().get(func_name)
    # 校验是否为可调用的函数
    if not callable(target_func):
        raise ValueError(f"{func_name} 不是可调用的有效函数")
    return target_func(a, b)

注意事项:

  • 存在安全隐患,如果func_name来自外部输入,攻击者可能传入危险函数名执行恶意逻辑
  • 匹配范围过大,容易命中预期外的可调用对象

方案3:类成员函数场景适配

如果所有处理函数是类的成员方法,可以用getattr动态获取方法调用:

class BlendOperator:
    def add(self, a, b):
        return a + b
    def mix(self, a, b):
        return a * b

def run(func_name, a, b):
    operator = BlendOperator()
    target_func = getattr(operator, func_name, None)
    if not callable(target_func):
        raise ValueError(f"类中不存在名为 {func_name} 的方法")
    return target_func(a, b)

内容的提问来源于stack exchange,提问作者Delta qyto

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 16:24:03