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

如何从含参数与表达式的字符串列表自动生成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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 14:40:19