如何使用任何输入变量名称从字符串解析 python 函数?

How to parse python functions from strings, with any input variable name?

我的应用程序允许用户指定简单的 python 表达式以用作给定变量的函数。例如,用户可以编写 'x**2 + 2*x + 4',我的应用会将其解析为 x 的函数,相当于 lambda x: x**2 + 2*x + 4。我已经知道如何使用:

def _f(expression, template):
    code = parser.expr(expression).compile()
    return template(code)

def function_x(expression):
    return _f(expression, lambda code: lambda x: eval(code))

但是,这只会为 x 创建一个函数解析器。如果我想让一个不同的变量工作,我将不得不定义更多的解析器,比如:

def function_xy(expression):
    return _f(expression, lambda code: lambda x, y: eval(code))

def function_n(expression):
    return _f(expression, lambda code: lambda n: eval(code))

def function_A(expression):
    return _f(expression, lambda code: lambda A: eval(code))

有没有更好的方法来解析任何预先指定变量的用户函数?也就是说,我可以在UI中预定义某个输入域接受u的函数,同时预定义另一个输入域接受v的函数,以此类推。只有字母 u 可以在第一个输入字段中使用,而只有字母 v 可以在第二个输入字段中使用。

请注意,变量名称本身是预定义的;用户不选择他或她想使用的字母。

使用lambdify module from Sympy, full docs here

这个包有几种可能的方法来解决这个问题,因为它支持强大级别的完整符号计算(例如,1, 2, 3

例如

from sympy import sympify
f = sympify('x**2 + y**2')
f.subs({'x':1, 'y':2})

根据您希望如何使用该包,您可以将其应用于模块化设计的核心级别,或者在最后一刻将其应用到表达式中。原文 link 展示了如何以一种方式从 sympy 转换为通用 python lambda 函数

这条路线将为您节省很多时间。例如,如果我输入 "sin(x)",您现有的 "working" 代码就会崩溃,而 sympy 可以轻松处理它。那是我尝试的第一个 - 符号计算真的很难。 IMO,额外的包值得在调试过程中头疼和花费数小时