这是我的问题:
考虑到我有这种形式的输入(字符串输入):
"(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?
如果没有,我应该转向抽象语法树,也许是递归解析器和语法?或者有图书馆这样做吗?
提前致谢!
答案 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)定义的所有名称也可以从它那里获得。