shelve 모듈에 대한 래퍼 클래스를 작성 중이므로 사전과 같이 사용하려고합니다. 코드는 다음과 같습니다.Python에서 shelve 모듈과 함께 __repr__ 사용
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()'를 사용해야합니다. –
나는 그것을 시도하고 나에게이 오류 준 :에 AttributeError를 파일 "", 라인 1 : '>>> s.keys()를 역 추적 (가장 최근 통화 마지막) MyShelve 인스턴스가 어떤 속성이 없습니다 'keys'' "key in dict"표현식을 좋아하고 영구적 사전에 구현하고 싶습니다. –
czayas
15 분 안에 답변 해 드리겠습니다. 문제는'__getitem__'과'__setitem__'을 잘못하고있는 것입니다. 문서를보십시오. –