shelve是Python标准库中的一个模块。文档对此很清楚:值(不是键!)工具架中可以是任意的Python对象—pickle模块可以处理的任何对象。。。键是普通的字符串
根据构造,shelve只接受字符串作为键。在
根据pypi提供的文档,swess仍然处于Beta测试阶段,我看不到任何证据表明它支持的是键的字符串之外的任何东西(错误object has no attribute 'rstrip'我们认为它不支持)。在
如果我是你,我会坚持使用众所周知的shelve,并用一个键序列化层来包装它。正如padraiccunningham所建议的,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()
你可以这样使用它:
^{pr2}$
然后,d将接受元组作为键,并将它们存储在底层的shelf中。在
注意:如果您以后想使用不同的持久性实现,前提是该实现是一个映射(类dict),那么您可以通过简单地更改close和sync方法(shelve specific)重用tuple_dict,但是其他实现需要什么。事实上,除了这两种方法之外,tuple-u-dict只是包装了一个普通的dict,因此任何映射类。。。在