【发布时间】:2014-12-20 22:32:06
【问题描述】:
我正在为 shelve 模块编写一个包装类,我打算像字典一样使用它。代码如下:
import shelve
class MyShelve:
def __init__(self, filename='myshelve.db'):
self.s = shelve.open(filename)
def __del__(self):
self.s.close()
def __repr__(self):
return repr(self.s)
def __getitem__(self, k):
return self.s.get(k, None)
def __setitem__(self, k, v):
self.s[k] = v
在我使用“key in dict”之前,一切似乎都很好。这是一个示例会话:
>>> d = {'1': 'One', '2': 'Two'}
>>> d
{'1': 'One', '2': 'Two'}
>>> '1' in d
True
>>> from myshelve import MyShelve
>>> s = MyShelve()
>>> s['1'] = 'One'
>>> s['2'] = 'Two'
>>> s
{'1': 'One', '2': 'Two'}
>>> '1' in s.s
True
>>> '1' in s
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "myshelve.py", line 15, in __getitem__
return self.s.get(k, None)
File "/usr/lib64/python2.7/shelve.py", line 113, in get
if key in self.dict:
File "/usr/lib64/python2.7/_abcoll.py", line 369, in __contains__
self[key]
File "/usr/lib64/python2.7/bsddb/__init__.py", line 270, in __getitem__
return _DeadlockWrap(lambda: self.db[key]) # self.db[key]
File "/usr/lib64/python2.7/bsddb/dbutils.py", line 68, in DeadlockWrap
return function(*_args, **_kwargs)
File "/usr/lib64/python2.7/bsddb/__init__.py", line 270, in <lambda>
return _DeadlockWrap(lambda: self.db[key]) # self.db[key]
TypeError: Integer keys only allowed for Recno and Queue DB's
我做错了什么?
【问题讨论】:
-
您需要使用
s.keys()。 -
我试过了,它给了我这个错误:
>>> s.keys() Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: MyShelve instance has no attribute 'keys'我喜欢“字典中的键”表达式,我想在持久字典中实现它。 -
我会在 15 分钟内给你答复。问题是你只是做错了
__getitem__和__setitem__。查看文档。
标签: python persistence shelve repr