这是我的问题:
考虑到我有这种形式的输入(字符串输入):
"(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?
如果不是,我是否应该转向抽象语法树和递归解析器和语法?或者是否有图书馆可以这样做?
提前致谢!
最佳答案
如果您可以将公式重写为有效的 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
命令然后使用给定的字典作为命名空间执行代码,即编译代码中使用的所有名称而不是由代码本身定义的都来自这个字典并且所有命名代码(也可以从中重新定义。
关于python - 使用 python 评估已评估数学表达式中的成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29793742/