python - 使用 python 评估已评估数学表达式中的成员

标签 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?

如果不是,我是否应该转向抽象语法树和递归解析器和语法?或者是否有图书馆可以这样做?

提前致谢!

最佳答案

如果您可以将公式重写为有效的 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/

相关文章:

python - 如何判断 "except urllib2.URLError, e"中是否有 e

python - 将 python、numpy 和 scipy 代码转换为 C++ 兼容代码?

python - 发送到 X11 的 rpy 作的图突然关闭?

function - 如何评估GDB中的函数?

wolfram-mathematica - Mathematica-为什么TreeForm [Unevaluated [4 ^ 5]]评估4 ^ 5?

python - NOAA Weather REST API 在使用 curl 请求时导致错误

python - 过滤器在Elasticsearch中不起作用

c++ -++x %= 10 在 C++ 中是否明确定义?

performance - 为什么严格长度函数的执行速度明显更快?

PowerShell:1234 和 (1234) 有什么区别?