我正在用Python开发一个GUI应用程序,它以基于XML的格式存储它的文档。该应用程序是一个数学模型,其中有几个可以拖放的预定义组件。我还希望用户能够通过在应用程序中提供的编辑器中编写python函数来创建自定义组件。我的问题是将这些函数存储在XML中。
一个函数可能看起来像这样:
def func(node, timestamp):
return node.weight * timestamp.day + 4
这些函数包含在一个对象中,该对象提供了一种调用它们的标准方法(与预定义的组件相比)。如果我是直接从Python创建一个,它将如下所示:
parameter = ParameterFunction(func)
然后模型调用该函数,如下所示:
parameter.value(node=node, timestamp=timestamp)
ParameterFunction
对象具有to_xml
和from_xml
函数,需要将对象序列化/反序列化为XML表示形式。
我的问题是:如何将Python函数存储在XML文档中?
我到目前为止所考虑的一个解决方案是将函数定义存储为字符串eval()
或exec()
以供使用但保留字符串,然后将字符串存储在CDATA块中XML。我有没有看到这个问题?
另一种方法是将所有Python代码存储在单独的文件中,并使XML引用只是函数名称。这可能很好,因为它可以在外部编辑器中轻松编辑。在哪种情况下,导入代码的最佳方法是什么?我正在设想与python导入路径战斗......
我知道运行不受信任的代码会有安全问题,但我愿意为用户提供自由权利。
我指的具体应用程序是在github上。如果需要,我很乐意提供更多信息,但我试图在这里保持相当通用。 https://github.com/snorfalorpagus/pywr/blob/120928eaacb9206701ceb9bc91a5d73740db1953/pywr/core.py#L396-L402
答案 0 :(得分:1)
不,你有我能想到的最简单,最好的解决方案。只要您不担心运行不受信任的代码,只需将它们保留为字符串即可。
我处理包含像你这样的小片段的外部python脚本的方式是将它们视为纯文本文件并以字符串形式读取它们。这避免了导入它们的所有问题。只需阅读它们并在它们上面调用exec
,然后函数将存在于范围内。
编辑:我打算在沙盒python代码上添加一些内容,但是经过一些research之后,这似乎不是一件容易的事,沙盒就更容易了。整个计划。限制不受信任代码的另一种更长和更难的方法是创建自己的小解释器,它只进行安全操作(即数学运算,调用现有函数等)。