shelve
是 Python 标准库中的一个模块。文档很清楚:架子中的值(不是键!)本质上可以是任意 Python 对象——pickle 模块可以处理的任何东西......键是普通字符串
通过构建搁置将只接受字符串作为键。
根据 pypi 的文档,Shove 仍处于测试阶段,我看不到任何证据表明它支持键的字符串以外的任何东西(错误object has no attribute 'rstrip'
让认为它不支持)。
如果我是你,我会坚持使用众所周知的shelve
,并用密钥序列化层包装它。正如 Padraic Cunningham 所建议的那样,pickle
应该完成这项工作。
这是一个(未经广泛测试)可能的实现:
class tuple_dict(collections.MutableMapping):
class iterator(collections.Iterator):
def __init__(self, d):
self.it = d.udict.__iter__()
def __iter__(self):
return self
def next(self):
return pickle.loads(next(self.it))
def __init__(self, udict):
self.udict = udict
def __getitem__(self, key):
ukey = pickle.dumps(key)
return self.udict[ukey]
def __setitem__(self, key, value):
ukey = pickle.dumps(key)
self.udict[ukey] = value
def __delitem__(self, key):
ukey = pickle.dumps(key)
del self.udict[ukey]
def keys(self):
return [ pickle.loads(key) for key in self.udict.keys() ]
def __iter__(self):
return self.iterator(self)
def __len__(self):
return len(self.udict)
def __contains__(self, key):
return pickle.dumps(key) in self.udict
def sync(self):
self.udict.sync()
def close(self):
self.udict.close()
你会这样使用它:
import shelve
underlying_d = shelve.open('tmp/test.db')
d = tuple_dict(underlying_d)
然后 d 将接受元组作为键并将它们全部存储在底层架子中。
注意:如果您以后想要使用不同的持久性实现,只要该实现是一个映射(类字典),您可以tuple_dict
通过简单地更改关闭和同步方法(搁置特定)来重用,但是其他实现需要什么. 事实上,除了这两种方法 tuple_dict 只是包装了一个普通的 dict - 因此任何映射类......