我需要能够采用使用OpenDocument公式语法的公式,将其解析为Python可以理解的语法,但无需评估变量,然后能够通过更改变量的贵重物品多次评估公式.
公式可以作为用户输入,因此pyparsing使我既可以有效地处理公式语法,又可以清理用户输入.有很多很好的pyparsing示例,但是所有数学上的例子似乎都假设一个人可以立即评估当前范围内的所有内容.
就上下文而言,我正在使用工业经济模型(生命周期评估或LCA),其中这些公式代表过程之间的材料或能量交换量.可变数量可以是几个参数(例如地理位置)的函数.公式和变量引用的链存储在有向无环图中,因此始终可以对公式进行简单评估.公式以字符串形式存储在数据库中.
我的问题是:
>是否可以解析一个公式,使得解析后的评估结果也可以存储在数据库中(作为要逃避的字符串或其他形式)?
>是否有替代方法?请记住,理想的解决方案是解析/写入一次,然后读取多次.例如,部分解析公式,然后使用ast模块,尽管我不知道如何使用数据库存储.
>我可以查看与此类似的项目或库的任何示例吗?我不是程序员,只是一个学生,在业余时间制作开放源代码LCA软件模型时试图完成自己的论文.
>这种方法太慢了吗?我希望能够进行大量的蒙特卡洛运行,其中每个运行可能涉及数以万计的公式评估(这是一个大数据库).
解决方法:
1)是的,可以通过解析表达式来腌制结果,并将其保存到数据库中.然后,您可以仅获取和释放表达式,而无需重新解析原始表达式.
2)您可以仅使用compile和eval内置插件来完成此任务,如以下交互式会话所示:
>>> y = compile("m*x+b","","eval")
>>> m = 100
>>> x = 5
>>> b = 1
>>> eval(y)
501
当然,这具有任何基于评估或基于exec的实现的安全隐患,因为不受信任或恶意的源字符串可能会嵌入有害的系统调用.但是,如果这是您的命题,并且完全在您的控制范围之内,那么请不要做任何愚蠢的事情.
3)您可以在pyparsing Wiki的“示例”页面上获得在线示例,将表达式解析为“可评估”的数据结构.特别是检查simpleBool.py和evalArith.py.如果您感觉很忙,请订购一本Python杂志的May,2008 issue的后刊,其中有我的文章“用Pyparsing写一个简单的解释器/编译器”,其中对使用的方法进行了更详细的描述,以及对酸洗和解酸的描述.解析的结果有效.
4)较慢的部分是解析,因此您以某种中间且可重复评估的形式保存这些结果是正确的.评估部分应该相当活泼.第二个慢的部分是从数据库中获取这些腌制的结构.在您的MC运行期间,我将打包一个函数,该函数采用表达式的选择参数,从数据库中获取数据,并进行点刺并返回可评估的表达式.然后,一旦完成这项工作,就可以使用备忘录装饰器来缓存这些查询结果对,这样,任何给定的表达式只需要被提取/取消提取一次.
祝你论文好运!