如何将对象pickle到单独的文件中并使用保留的标识恢复它们

2024-09-24 12:21:47 发布

您现在位置:Python中文网/ 问答频道 /正文

出于某种原因,我需要将对象pickle到多个文件中。这些pickle之间共享的对象当然会作为不同的对象取消pickle

a = [1, 2, 3]
b = [1, 2, a]

assert a is b[2]

aa = pickle.loads(pickle.dumps(a))
bb = pickle.loads(pickle.dumps(b))

assert aa is bb[2]  # AssertionError

This post有一个自定义用户类的答案,但我正在寻找一种适用于任何可拾取对象的方法,因此它需要是非侵入性的

这是我到目前为止的示例框架代码:

class Writer:

    def __init__(self):
        self.objids = set()  # To remember what have been pickled.

    def write(self, objs, files):
        for obj, file in zip(objs, files):
            with open(file, "wb") as f:
                MyPickler(f, self).dump(obj)


class Reader:

    def __init__(self):
        self.restored = {}  # To buffer restored objects for later use

    def read(self, files):
        for file in files:
            with open(file, "rb") as f:
                MyUnpickler(f, self).load()



class MyPickler(pickle.Pickler):

    def __init__(self, file, writer):
        super().__init__(file)
        self.writer = writer



class MyUnpickler(pickle.Unpickler):

    def __init__(self, file, reader):
        super().__init__(file)
        self.reader = reader



if __name__ == "__main__":

    files = ["a_pickle", "b_pickle"]

    Writer().write([a, b], files)
    rd = Reader()
    rd.read(files)

我已经尝试实现了reducer_override(在python3.8中是新的)或persistent_idpersistent_load方法 在MyPickler/MyUnpickler中,但没有成功

请注意,我不需要保留活动对象和未勾选对象之间的标识。我只需要Reader/Writer同时进行pickle和unpickle的对象之间的标识一致性


Tags: 对象selfforinitdeffilespickleclass