代码之家  ›  专栏  ›  技术社区  ›  Jivan

Python Pickle的替代方案对重构不太敏感

  •  0
  • Jivan  · 技术社区  · 4 年前

    这可能是一个相对常见的问题,但到目前为止我还没有找到任何真正的答案。

    import pickle
    import time
    
    from foo.bar import baz
    
    class MyClass:
        def __init__(self):
            self.message = baz.very_long_computation()
    
    obj = MyClass()
    
    with open('./obj.pickle', 'wb') as f:
        pickle.dump(obj)
    

    从同一存储库中的另一个文件,我想加载实例化的对象并使用它,而不必等待:

    import pickle
    
    with open('./obj.pickle', 'rb') as f:
        obj = pickle.load(f)
    
    print(obj.message)
    

    有时可能发生的情况是,我会改变 baz 模块在文件夹结构中的位置(不必修改其内容),例如我将其从 foo.bar.baz qux.bar.baz

    现在,如果我尝试加载 obj.pickle Python会再次抱怨 ModuleNotFoundError: No module named foo

    似乎每当我进行最轻微的重构时,我都必须完全重新实例化 MyClass ,涉及这么长的等待时间。在实践中,这非常令人讨厌,因此我提出了两个问题:

    • 除了Pickle之外,还有什么不强制重新实例化的替代方案吗?
    • 有没有办法在使用泡菜的同时避免这个问题?

    注意:我知道在上面的例子中,我只需要保存 self.message 转换成一个文本文件,并称之为一天。事实上,以这种方式持久化对象的内容是很复杂的。

    0 回复  |  直到 4 年前