【问题标题】:Python: Alternatives to pickling a modulePython:酸洗模块的替代方案
【发布时间】:2009-08-27 03:39:48
【问题描述】:

我正在开发我的程序GarlicSim,用户在该程序中创建了一个模拟,然后他可以根据需要对其进行操作,然后他可以将其保存到文件中。

我最近尝试实现保存功能。我很自然地想到要腌制包含整个模拟的Project 对象。

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

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

(我还要注意,模拟包是在程序中动态导入的。)

【问题讨论】:

    标签: python module pickle


    【解决方案1】:

    如果项目以某种方式引用了包含您需要的东西的模块,听起来您可能希望将该模块的使用重构为模块内的类。无论如何,这通常会更好,因为使用模块来处理东西闻起来像是一个巨大的全局。以我的经验,这样的应用结构只会带来麻烦。

    (当然,快速的出路是保存模块的dict而不是模块本身。)

    【讨论】:

    • 你的意思是,不是引用动态导入的模块,而是引用动态导入的模块中定义的类?
    • 是的;动态实例化一个类似乎比动态导入一个模块更干净。
    • 这很有趣。但我认为这有点问题。我的程序的工作方式是用户选择要导入的模拟包。也就是说,有针对不同类型模拟的预先编写的模拟包(例如,一个用于牛顿物理学,一个用于博弈论......)。您是否建议我在这些预先编写的包中定义一个类并让所有对象成为它的属性?
    • 这听起来像是一种方法,但如果不了解更多关于您的包裹如何完全组合在一起的信息,就很难说。如果您想更改最少的代码,您可以在不同的包中只使用一个具有众所周知的名称(例如每个模块中的相同名称)的类,并且仍然进行动态导入。
    • 模块不具有状态。类旨在具有状态。保存对象会保存类的状态。这就是它应该工作的方式。您将复杂的模拟“包装”在 Facade 类中,该类封装了整个模拟并且可以作为“单一”事物持久化。里面还有很多其他的东西。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2021-11-01
      • 1970-01-01
      • 2011-01-08
      • 2013-04-16
      • 1970-01-01
      • 1970-01-01
      • 2018-04-25
      • 1970-01-01
      • 2012-05-03
      相关资源
      最近更新 更多