访问 "internal variables" 个列表

Accessing "internal variables" of list

我创建了一个列表的子类,它经常写入文件,这样即使在发生灾难性故障时我也可以恢复数据。但是,我不确定我是否以最佳方式处理 IO。

import cPickle

class IOlist(list):
    def __init__(self, filename, sentinel):
        list.__init__(self)
        self.filename = filename
    def save(self):
        with open(self.filename, 'wb') as ouf:
            cPickle.dump(list(self), ouf)
    def load(self):
        with open(self.filename, 'rb') as inf:
            lst = cPickle.load(inf)
        for item in lst:
            self.append(item)

在我读入文件后将每个对象一一添加回列表感觉不对。有一个更好的方法吗?我希望您可以访问列表对象的内部结构并执行类似

的操作
    def load(self):
        with open(self.filename, 'rb') as inf:
            self.list_items = cPickle.load(inf)

不幸的是 vars(list) 似乎显示列表没有 __dict__ 属性,我不知道还能在哪里查找列表项的存储位置。

我试过self = cPickle.load(inf),但也没用。

您可以使用 extend() 来加载您的 unpickled 列表:

self.extend(cPickle.load(inf))

您应该能够使用

将 pickle 直接加载到列表中
def load(self):
    with open(self.filename, 'rb') as inf:
        self[:] = cPickle.load(inf)

另一个观察,如果在保存过程中出现问题,您可能会删除最新的持久化列表,而无法恢复。您最好使用一个单独的文件(可能使用 tempfile 或类似文件,或者只管理 2 个文件),然后在您确定列表已成功保留后替换以前的文件。

您确实想用加载的列表替换当前列表的全部内容。为此,您可以使用切片:

self[:] = lst