2009-12-17 61 views
3

我需要能夠採取使用OpenDocument格式公式語法的公式,它解析爲語法,Python可以理解,但沒有評估的變量,然後能夠多次與不斷變化的評估公式貴重物品的變數。 公式可以是用戶輸入,所以pyparsing允許我有效地處理公式語法,並清除用戶輸入。有很多pyparsing的例子可用,但所有的數學似乎都假定立即評估當前範圍內的所有內容。部分評價與pyparsing

對於上下文,我正在與工業經濟(生命週期評價,或LCA),其中,這些式中表示進程之間的材料或能量交換的量的模型工作。可變量可以是幾個參數的函數,例如地理位置。公式鏈和變量引用存儲在有向無環圖中,因此公式總是可以被簡單地評估。公式作爲字符串存儲在數據庫中。 我的問題是:

  1. 是否可以解析公式使得分析評估,也可以存儲在數據庫中(作爲一個字符串被evaled,或者別的什麼)?
  2. 這種方法是否有其他選擇?請記住,理想的解決方案是解析/寫入一次,並多次閱讀。例如,部分解析公式,然後使用ast模塊,儘管我不知道這可以用於數據庫存儲。
  3. 任何類似這樣的項目或庫的例子,我可以看看?我不是程序員,只是一個學生在空閒時間製作開源LCA軟件模型時試圖完成他的論文。
  4. 這種方法太慢了嗎?我希望能夠進行大量的蒙特卡羅運行,每次運行都可能涉及數以萬計的公式評估(這是一個很大的數據庫)。

回答

4

1)是的,可以從解析表達式中醃製結果,並將其保存到數據庫中。然後,您可以取出並取消表達式,而不是重新解析原始表達式。

2)用戶可在此快速和骯髒的傳球僅僅使用編譯和eval內置插件,如下面的交互式會話:

>>> y = compile("m*x+b","","eval") 
>>> m = 100 
>>> x = 5 
>>> b = 1 
>>> eval(y) 
501 

當然,這有安全隱患基於任何基於eval或exec的實現,因爲不可信或惡意的源字符串可能會嵌入有害的系統調用。但如果這是你的論點,並且完全在你的控制範圍內,那就不要做任何愚蠢的事情。

3)你可以得到解析表達式轉換成在pyparsing wiki的例子頁面「可求」的數據結構的在線例子。特別檢查出simpleBool.pyevalArith.py。如果你感覺沖洗,責令Python的雜誌,裏面有我的文章「寫作與Pyparsing一個簡單的解釋器/編譯器」所使用的方法更詳細的描述的May,2008 issue的背部問題,以及如何封裝狀態的描述解析結果起作用。

4)緩部分將是解析,讓你在維護這些結果中的一些中間和可重複,可評估的形式,在正確的軌道上。 eval部分應該相當活潑。第二個緩慢的部分將從數據庫中提取這些醃製結構。在MC運行期間,我將打包一個函數,該函數爲表達式選擇參數,從數據庫提取數據,並取消並返回可評估表達式。然後,一旦你有這個工作,使用memoize修飾器來緩存這些查詢結果對,以便任何給定的表達式只需要被取/取一次。

祝你的論文好運!