如何从含参数与表达式的字符串列表自动生成Python函数?
问题描述
给定一个包含参数与表达式的字符串列表,示例如下:
['input1', 'input2', 'output1', 'output1 = input1 + input2']
需要自动生成符合以下格式的函数:
def function(input1, input2): output1 = input1 + input2 return output1
尝试使用Python的eval()函数将字符串表达式转为等式时,遇到了参数未定义的错误(如'input1' is not defined)。现需解决:如何处理输入输出参数的求值以避免此类错误?是否需要先处理参数再处理表达式,或者有eval()之外的替代方案?
补充要求:尽量不要给变量分配浮点值,让等式保持字面量形式。
解决方案
方案1:动态生成函数源码(推荐)
直接拼接函数的源码字符串,通过exec()执行生成目标函数。这种方式完全保留等式的字面量形式,不存在作用域导致的变量未定义问题,生成的函数和手动编写的效果一致。
示例代码:
def generate_function(def_list): # 分离输入参数和表达式 inputs = [] expr = None for item in def_list: if "=" in item: expr = item else: inputs.append(item) # 从表达式中提取输出变量名 output_var = expr.split("=")[0].strip() # 拼接完整的函数源码 func_code = f"""def generated_function({', '.join(inputs)}): {expr} return {output_var} """ # 执行源码生成函数,存入局部命名空间 local_namespace = {} exec(func_code, globals(), local_namespace) return local_namespace['generated_function'] # 测试示例 def_list = ['input1', 'input2', 'output1', 'output1 = input1 + input2'] my_func = generate_function(def_list) print(my_func(3, 5)) # 输出 8
方案2:通过exec()配合局部作用域处理
如果倾向于用动态作用域的方式实现,可将输入参数绑定到字典作为局部作用域,用exec()执行赋值表达式(注意:eval()无法处理赋值语句,必须用exec()),最后从作用域中取出结果。
示例代码:
def generate_function_with_scope(def_list): # 提取输入参数和表达式 inputs = [item for item in def_list if "=" not in item] expr = next(item for item in def_list if "=" in item) output_var = expr.split("=")[0].strip() def generated_func(*args): # 将输入参数与变量名绑定到局部作用域字典 local_scope = dict(zip(inputs, args)) # 执行赋值语句 exec(expr, globals(), local_scope) # 返回计算后的输出变量 return local_scope[output_var] return generated_func # 测试示例 my_func = generate_function_with_scope(['input1', 'input2', 'output1', 'output1 = input1 + input2']) print(my_func(2, 4)) # 输出 6
关键注意点
eval()仅能处理表达式(如input1 + input2),无法处理赋值语句(如output1 = input1 + input2),赋值操作必须使用exec()。- 动态生成源码的方式更直观,生成的函数可直接查看结构,调试和维护更方便。
- 两种方案都不会提前给变量分配浮点值,等式会保持字面量运算逻辑,运行时会根据输入参数的实际类型计算结果。
内容的提问来源于stack exchange,提问作者Remi
相关产品推荐
相关产品推荐

