这可能是一个相对常见的问题,但到目前为止我还没有找到任何真正的答案。
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
转换成一个文本文件,并称之为一天。事实上,以这种方式持久化对象的内容是很复杂的。