如何使用任何输入变量名称从字符串解析 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,额外的包值得在调试过程中头疼和花费数小时
我的应用程序允许用户指定简单的 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,额外的包值得在调试过程中头疼和花费数小时