1

我正在用 Python 做一个项目,该项目涉及大量使用持久字典的交互工作。如果我不进行交互式开发,我可以使用 contextlib.closure 并且相当确信架子最终会被写入磁盘。但就目前而言,没有任何代码可以轻松地包含在“with”语句中。我宁愿不必相信自己在会话结束时在我的书架上调用 close()。

涉及的数据量并不大,每次操作后我都会很乐意将一个架子同步到磁盘。我发现自己为 shelve 编写了一个包装器,但我不是一个足够强大的 Python 程序员来识别我需要覆盖的正确的 dict 方法集。在我看来,如果我正在做的是一个好主意,那么它可能以前就已经做过了。处理此问题的典型正确方法是什么?

我要补充一点,我喜欢使用 shelve,因为它是一个简单的模块,而且它带有 Python。如果可能的话,我宁愿避免做一些需要(例如)拉入一个复杂的库来处理数据库的事情。

我正在使用带有 SP3 的 WinXP、通过 Anaconda 1.6.2(32 位)的 Python 2.7.5,并在 Spyder 中运行。通过查看支持我的书架的文件的修改时间,我可以知道在我调用同步或关闭之前,书架不会更新。

4

1 回答 1

2

您可以做的是子类化DbfilenameShelf和覆盖__setitem__,并__delitem__在每次更改后自动同步。像这样的东西可能会起作用(未经测试):

from shelve import DbfilenameShelf

class AutoSyncShelf(DbfilenameShelf):
    # default to newer pickle protocol and writeback=True
    def __init__(self, filename, protocol=2, writeback=True):
        DbfilenameShelf.__init__(self, filename, protocol=protocol, writeback=writeback)
    def __setitem__(self, key, value):
        DbfilenameShelf.__setitem__(self, key, value)
        self.sync()
    def __delitem__(self, key):
        DbfilenameShelf.__delitem__(self, key)
        self.sync()

my_shelf = AutoSyncShelf("myshelf")

当然,我不能保证它的表现。

于 2013-10-06T22:42:26.903 回答