使用python

时间:2015-04-22 09:49:04

标签: python evaluation

这是我的问题:

考虑到我有这种形式的输入(字符串输入):

"(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?

如果没有,我应该转向抽象语法树,也许是递归解析器和语法?或者有图书馆这样做吗?

提前致谢!

1 个答案:

答案 0 :(得分:1)

如果您可以将公式重写为有效的Python,即将作业转移到前面的x,那么您可以使用自定义命名空间字典compile()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命令执行带有给定字典作为命名空间的代码,即编译代码中使用但未由代码本身定义的所有名称都来自此字典,代码(re)定义的所有名称也可以从它那里获得。