我需要能够使用OpenDocument公式语法的公式,将其解析为Python可以理解的语法,但不评估变量,然后能够通过更改变量的有价值来多次评估公式。 公式可以是用户输入,因此pyparsing允许我有效地处理公式语法,并清理用户输入。有许多可用的pyparsing的好例子,但是所有的数学似乎都假设一个人立即评估当前范围内的所有内容。
就上下文而言,我正在使用工业经济模型(生命周期评估或LCA),其中这些公式代表过程之间的物质或能量交换量。可变量可以是若干参数的函数,例如地理位置。公式链和变量引用存储在有向非循环图中,因此可以始终简单地评估公式。公式作为字符串存储在数据库中。 我的问题是:
答案 0 :(得分:4)
1)是的,可以通过解析表达式来挑选结果,并将其保存到数据库中。然后你可以只获取和取消表达式,而不是再次重新解析原始表达式。
2)您可以使用compile和eval内置函数在此处进行快速传递,如下面的交互式会话:
>>> y = compile("m*x+b","","eval")
>>> m = 100
>>> x = 5
>>> b = 1
>>> eval(y)
501
当然,这存在任何基于eval或exec的实现的安全隐患,因为不受信任或恶意的源字符串可以嵌入有害的系统调用。但如果这是你的论文,完全在你的控制范围内,那就不要做任何愚蠢的事情。
3)您可以在pyparsing wiki的Examples页面上获得一个将表达式解析为“可评估”数据结构的在线示例。请特别查看simpleBool.py和evalArith.py。如果您感觉同花顺,请订购{杂志May,2008 issue的后期问题,其中有我的文章“使用Pyparsing编写简单的解释器/编译器”,其中包含对所用方法的更详细描述,以及如何解析和解析解析后的结果。
4)慢速部分将是解析,因此您可以在一些中间且可重复评估的形式中保留这些结果。评估部分应该相当活泼。第二个缓慢的部分是从数据库中获取这些酸洗结构。在MC运行期间,我将打包一个函数,该函数接受表达式的选择参数,从数据库中取出,以及unpickles并返回可评估的表达式。然后,一旦你有了这个工作,使用memoize装饰器来缓存这些查询结果对,这样任何给定的表达式只需要被提取/取消一次。
祝你的论文好运!