我的应用程序允许用户指定简单的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
才能在第二个输入字段中起作用。
请注意,变量名称本身是预定义的;用户不会选择他或她想要使用的字母。
答案 0 :(得分:1)
使用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})
根据您希望如何使用软件包,您可以将其应用于核心级别以进行模块化设计,或者在最后时刻应用于表达式中。原始链接显示了如何以一种方式从sympy转换为泛型python lambda函数
你会为这条路线节省很多时间。例如,如果我输入"sin(x)"
,那么您现有的“工作”代码会崩溃,而sympy可以轻松处理它。这是我尝试的第一个 - 象征性计算真的很难。 IMO,这个额外的软件包值得头疼,并且需要花费数小时的时间进行调试