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

时间:2016-07-06 01:38:40

标签: python parsing user-defined-functions

我的应用程序允许用户指定简单的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才能在第二个输入字段中起作用。

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

1 个答案:

答案 0 :(得分:1)

使用lambdify module from Sympyfull docs here

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

例如

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

根据您希望如何使用软件包,您可以将其应用于核心级别以进行模块化设计,或者在最后时刻应用于表达式中。原始链接显示了如何以一种方式从sympy转换为泛型python lambda函数

你会为这条路线节省很多时间。例如,如果我输入"sin(x)",那么您现有的“工作”代码会崩溃,而sympy可以轻松处理它。这是我尝试的第一个 - 象征性计算真的很难。 IMO,这个额外的软件包值得头疼,并且需要花费数小时的时间进行调试