您可以覆盖__getstate__
以写入新的 pickle 文件并返回其路径,并__setstate__
取消文件。
import pickle, os
DIRNAME = 'path/to/my/pickles/'
class AutoPickleable:
def __getstate__(self):
state = dict(self.__dict__)
path = os.path.join(DIRNAME, str(id(self)))
with open(path, 'wb') as f:
pickle.dump(state, f)
return path
def __setstate__(self, path):
with open(path, 'b') as f:
state = pickle.load(f)
self.__dict__.update(state)
现在,每种应该具有这种特殊的自动腌制行为的类型都应该子类化AutoPickleable
.
当您想转储文件时,您可以执行pickle.dumps(obj)
或copy.deepcopy(obj)
忽略结果。
Unpickling 照常工作 ( pickle.load
)。如果您想从文件路径(而不是从 的结果pickle.dumps
)恢复对象,这有点棘手。如果您需要,请告诉我,我会添加详细信息。无论如何,如果你AutoPickleable
用“标准”对象包装你的对象,并对其进行所有泡菜操作,它应该都可以工作。
这种方法有几个潜在的问题,但对于你描述的“干净”的情况,它可能会起作用。
一些注意事项:
- 无法“动态”指定要写入的目录。它必须是全局可访问的,并且在酸洗操作之前设置
- 如果多个对象保持对同一个对象的引用,或者您有循环引用,则可能不起作用
AutoPickleable
(通常,pickle 可以毫无问题地处理这些情况)
- 这里没有代码来清理目录/删除文件。