我正在使用Python进行一个涉及大量使用持久字典的交互式工作的项目。如果我没有进行交互式开发,我可以使用contextlib.closing并相当确信架子最终会被写入磁盘。但是,由于它没有任何代码块,我可以轻松地将其包含在“with”语句中。我宁愿不要相信自己在会话结束时在我的书架上打电话给close()。
所涉及的数据量并不大,我很乐意在每次操作后将一个架子同步到磁盘。我发现自己正在编写一个搁置的包装器,但是我不是一个足够强大的Python程序员来识别我需要覆盖的正确的dict方法集。在我看来,如果我正在做的是一个好主意,它可能以前就已经完成了。处理这个问题的正确方法是什么?
我要补充一点,我喜欢使用搁置,因为它是一个简单的模块,它附带了Python。如果可能的话,我宁愿避免做一些需要(例如)拉入一个复杂的库来处理数据库的事情。
我正在使用WinXP和SP3,Python 2.7.5通过Anaconda 1.6.2(32位),并在Spyder中运行。我可以通过查看支持我的书架的文件的修改时间来判断架子没有更新,直到我调用同步或关闭。
答案 0 :(得分: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")
当然,我无法保证表现。