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

Python中如何动态利用含变量名的字符串定义函数参数与返回值?

问题描述

我有一个存储着另一个变量名称的字符串变量:

mystring = 'var1'

我想要创建一个以var1作为输入的函数:

def myfun(var1):
    res = somefun(var1)
    return res

但我不想直接使用var1这个表达式,而是想用上述字符串来实现,类似这样(但该写法无效):

def myfun(eval(mystring)):
    res = somefun(eval(var1))
    return res

我知道通常函数参数的名称无关紧要,但在我的场景中并非如此。且不能用eval包裹整个函数定义,因为我是在已有代码基础上开发,该代码有此限制。我曾尝试仅对部分代码使用eval()或exec(),但未能成功。

补充说明

我需要批量声明多个类似函数(比如2个),如下所示:

def myfun1(var1):
    res1 = somefun(var1)
    return res1

def myfun2(var2):
    res2 = somefun(var2)
    return res2

其中参数和返回值的名称非常重要,因为我要对接的代码会通过这些名称将函数连接成计算图(例如myfun2的输出会被另一个以res2为输入的函数使用),这应该是通过inspect模块实现的。现在我希望通过循环动态生成这些函数,避免重复复制粘贴代码。另外我不能使用字典,因为依赖的代码假设所有变量都是numpy数组。

解决方案

可以用exec()动态构造并执行函数代码字符串,精准控制参数名、函数名和返回值变量名,既能满足inspect模块的识别需求,又能实现批量生成。

示例代码如下:

import numpy as np

# 假设这是业务依赖的somefun
def somefun(x):
    return x * 2

# 定义批量生成的函数配置:函数名、参数名、返回值变量名
function_configs = [
    ("myfun1", "var1", "res1"),
    ("myfun2", "var2", "res2")
]

# 循环生成目标函数
for func_name, param_name, res_name in function_configs:
    # 构造对应函数的代码字符串
    func_code = f"""
def {func_name}({param_name}):
    {res_name} = somefun({param_name})
    return {res_name}
    """
    # 执行代码字符串,在全局命名空间生成函数
    exec(func_code, globals())

# 测试生成的函数
var1 = np.array([1,2,3])
var2 = np.array([4,5,6])

print(myfun1(var1))  # 输出: [2 4 6]
print(myfun2(var2))  # 输出: [8 10 12]

# 验证参数名是否符合要求(模拟inspect模块检测)
import inspect
print(inspect.signature(myfun1))  # 输出: (var1)
print(inspect.signature(myfun2))  # 输出: (var2)

说明

  • 用exec()执行构造好的代码字符串,生成的函数和手动编写的结构完全一致,inspect模块可正常识别参数名与函数结构。
  • 通过配置列表统一管理函数的各项名称,后续新增函数只需在function_configs中添加元组即可,无需重复编写函数模板代码。
  • 生成的函数内部直接使用指定的参数名和返回值变量名,完全符合依赖代码对numpy数组变量的要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 11:05:22