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
相关产品推荐
相关产品推荐

