2015-06-16 36 views
0

我正在開發一個Python應用程序中的GUI應用程序,它以XML格式存儲它的文檔。該應用程序是一個數學模型,其中有幾個可以拖放的預定義組件。我還希望用戶能夠通過在應用程序中提供的編輯器內編寫一個python函數來創建自定義組件。我的問題是將這些函數存儲在XML中。如何在XML文件中存儲python函數

一個函數可能看起來像這樣:

def func(node, timestamp): 
    return node.weight * timestamp.day + 4 

這些功能被包裹在其提供調用它們的標準方法的對象(與預先定義的組件)。如果我是從Python中創建一個直接就應該是這樣的:

parameter = ParameterFunction(func) 

的功能,然後通過模型這樣叫:

parameter.value(node=node, timestamp=timestamp) 

ParameterFunction對象有一個to_xmlfrom_xml功能,這需要將該對象序列化爲/從一個XML表示中解序列化。

我的問題是:如何將Python函數存儲在XML文檔中?

一個解決方案到目前爲止,我還以爲是存儲函數定義爲一個字符串,eval()exec()它的使用,但保持了字符串,那麼該字符串存儲在XML CDATA塊。有沒有我沒有看到的這個問題?

另一種方法是將所有的Python代碼存儲在一個單獨的文件中,並使XML參考只是函數名稱。這可能很好,因爲它可以在外部編輯器中輕鬆編輯。在這種情況下,導入代碼的最佳方式是什麼?我正在設想與python導入路徑的戰鬥...我知道有運行不受信任的代碼會有安全問題,但我願意爲它給予用戶的自由權衡這個折衷。

我指的具體應用是在github上。如果需要的話,我很樂意提供更多的信息,但我試圖在這裏保持相當通用。 https://github.com/snorfalorpagus/pywr/blob/120928eaacb9206701ceb9bc91a5d73740db1953/pywr/core.py#L396-L402

回答

1

不,你有我能想到的最簡單和最好的解決方案。只要將它們保持爲字符串,只要您不擔心運行不受信任的代碼。

我處理外部python腳本包含像你這樣的小片段的方式是將它們視爲純文本文件並以字符串形式讀取它們。這避免了導入它們的所有問題。只要閱讀它們並在其上調用exec,那麼函數將存在於範圍內。

編輯:我要補充的沙盒Python代碼的東西,但有點research後看來這不會是一件容易的事,它會更容易沙箱整個程序。限制不可信代碼的另一個更長更困難的方法是創建自己的小解釋器,只進行安全操作(如數學運算,調用現有函數等)。

相關問題