使用Python评估数学表达式中的成员

3

以下是我的问题:

假设我有一个这样的输入(字符串输入):

"(x = 5*y + 8) if z<3 else (x=4*y+9))"

我可以使用以下代码评估这种类型的字符串:

import parser
formula = "(5*y + 8) if z<3 else (4*y+9)"
code = parser.expr(formula).compile()

y = 10
z=8
print eval(code)

然而在这种情况下,表达式成员中没有等式。
我的问题是:是否有一种简单的方法可以解析输入以创建某种数学表达式,然后例如只给出y和z来最终计算x的值;并且只给出x和z来计算y?
如果没有,我应该转向抽象语法树,也许是递归解析器和语法?还是有一个库可以做到这样的事情?
提前感谢!

2
这里不接受有关库的请求,但您可能想了解一下 sympy... - jonrsharpe
请查看Xpresion,这也是Python的一个简单表达式解析引擎(顺便说一下,我是作者)。 - Nikos M.
尼科斯,你有使用Python的示例吗? - evoliptic
是的,请检查存储库中的测试文件夹,它具有相同的js/.php和python示例,支持用户变量和用户函数,但用户定义配置(请参见示例),提供了默认配置,其中使用三元?:运算符而不是python if else,但可以轻松更改为pythonic语法。 - Nikos M.
1个回答

1
如果您能将公式重写为有效的Python代码,即将赋值给x放在前面,那么您可以使用自定义命名空间字典进行编译()exec
#!/usr/bin/env python
from __future__ import absolute_import, division, print_function


def main():
    code = compile('x = (5*y + 8) if z<3 else (4*y+9)', '<main>', 'exec')
    namespace = {'y': 10, 'z': 8}
    exec code in namespace
    print(namespace['x'])


if __name__ == '__main__':
    main()

使用'exec'参数,传递给compile()的源代码可以是任何可以写在模块中的内容。
然后,exec命令使用给定的字典作为名称空间来执行代码。也就是说,在编译的代码中使用但未被代码本身定义的所有名称都来自此字典,并且代码重新定义的所有名称也可以从中使用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接