用pyparsing进行部分评估

时间:2009-12-17 09:49:49

标签: python parsing evaluation pyparsing

我需要能够使用OpenDocument公式语法的公式,将其解析为Python可以理解的语法,但不评估变量,然后能够通过更改变量的有价值来多次评估公式。 公式可以是用户输入,因此pyparsing允许我有效地处理公式语法,并清理用户输入。有许多可用的pyparsing的好例子,但是所有的数学似乎都假设一个人立即评估当前范围内的所有内容。

就上下文而言,我正在使用工业经济模型(生命周期评估或LCA),其中这些公式代表过程之间的物质或能量交换量。可变量可以是若干参数的函数,例如地理位置。公式链和变量引用存储在有向非循环图中,因此可以始终简单地评估公式。公式作为字符串存储在数据库中。 我的问题是:

  1. 是否可以解析一个公式,使得解析后的评估也可以存储在数据库中(作为要被篡改的字符串或其他内容)?
  2. 这种方法有替代方案吗?请记住,理想的解决方案是解析/写入一次,并多次读取。例如,部分解析公式,然后使用ast模块,虽然我不知道这如何适用于数据库存储。
  3. 我可以查看的与此类似的项目或库的任何示例?我不是程序员,只是一名学生在业余时间制作开源LCA软件模型时试图完成论文。
  4. 这种做法太慢了吗?我希望能够进行大量的蒙特卡罗运行,每次运行都可能涉及成千上万的公式评估(这是一个大型数据库)。

1 个答案:

答案 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.pyevalArith.py。如果您感觉同花顺,请订购{杂志May,2008 issue的后期问题,其中有我的文章“使用Pyparsing编写简单的解释器/编译器”,其中包含对所用方法的更详细描述,以及如何解析和解析解析后的结果。

4)慢速部分将是解析,因此您可以在一些中间且可重复评估的形式中保留这些结果。评估部分应该相当活泼。第二个缓慢的部分是从数据库中获取这些酸洗结构。在MC运行期间,我将打包一个函数,该函数接受表达式的选择参数,从数据库中取出,以及unpickles并返回可评估的表达式。然后,一旦你有了这个工作,使用memoize装饰器来缓存这些查询结果对,这样任何给定的表达式只需要被提取/取消一次。

祝你的论文好运!