Python:腌制模块的替代方案

时间:2009-08-26 19:19:50

标签: python module pickle

我正在制作我的程序GarlicSim,用户在其中创建模拟,然后他可以按照自己的意愿操作它,然后他可以将其保存到文件中。

我最近尝试实施保存功能。发生在我身上的自然事情是挑选包含整个模拟的Project对象。

问题是,Project对象还包括一个模块 - 即“模拟包”,它是一个包/模块,包含定义模拟的几个关键对象,主要是函数。我需要将它们与模拟一起保存,但似乎不可能腌制模块,正如我在试图挑选Project对象并且引发异常时所见证的那样。

解决这个限制的好方法是什么?

(我还应该注意,模拟包会在程序中动态导入。)

2 个答案:

答案 0 :(得分:2)

如果项目以某种方式引用了一个包含所需内容的模块,听起来您可能想要将该模块的使用重构为模块中的类。无论如何,这往往更好,因为使用一个模块来嗅到一大块全球的气味。根据我的经验,这样的应用程序结构只会导致麻烦。

(当然,快速解决方法是保存模块的 dict 而不是模块本身。)

答案 1 :(得分:1)

如果你有模拟包模块的原始代码,我认为它是动态生成的,那么我建议将其序列化并在加载时重建模块。您可以使用Project.__getstate__()Project.__setstate__()方法执行此操作。