我正在使用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