使用 python 计算已计算数学表达式中的成员
Evaluating a member in an evaluated mathematical expression using python
这是我的问题:
考虑到我有这种形式的输入(字符串输入):
"(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
命令以给定的字典作为命名空间执行代码,即编译代码中使用的所有名称而不是由代码本身定义的都来自这个字典并且所有名称都是代码(重新)定义也可以从中获得。
这是我的问题:
考虑到我有这种形式的输入(字符串输入):
"(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
命令以给定的字典作为命名空间执行代码,即编译代码中使用的所有名称而不是由代码本身定义的都来自这个字典并且所有名称都是代码(重新)定义也可以从中获得。