我正在使用python的內置擱置模塊來管理一些簡單的字典。我遇到的問題是我想使用with shelve.open(filename) as f:
,但是當我嘗試它時,聲明DbfilenameShelf沒有屬性__exit__
。向現有類添加函數的最簡單方法
所以,我猜最簡單的方法是將它包裝在另一個類中,並將__exit__
函數添加到該包裝器中。我嘗試這樣做:
class Wrapper(shelve.DbfilenameShelf):
def __exit__(self):
self.close()
def __init__(self, filename, writeback=False):
shelve.DbfilenameShelf.__init__(self, filename, flag='c', protocol=None, writeback=False)
但是,當我試圖實例化的包裝,像這樣:wrapped = Wrapper(filename)
它告訴我,我給它一個無效的參數。根據要求
錯誤:
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "<input>", line 5, in __init__
File "C:\Python27\Lib\shelve.py", line 223, in __init__
Shelf.__init__(self, anydbm.open(filename, flag), protocol, writeback)
File "C:\Python27\Lib\anydbm.py", line 85, in open
return mod.open(file, flag, mode)
File "C:\Python27\Lib\dbhash.py", line 18, in open
return bsddb.hashopen(file, flag, mode)
File "C:\Python27\Lib\bsddb\__init__.py", line 364, in hashopen
d.open(file, db.DB_HASH, flags, mode)
DBInvalidArgError: (22, 'Invalid argument')
我們需要確切的錯誤信息。另外,上下文管理器不需要'__enter__'方法嗎? – delnan
我也有這個錯誤。我想知道是否與在系統上打開太多文件有關 - 用closing()封裝它減少了打開的文件開銷......用戶agf的解決方案爲我解決了它。 – NuclearPeon