我正在尝试在Python 3.3中使用shelve。建议使用with shelve.open('spam.db') as db:...
语法以确保我们关闭“连接”。但是,当我尝试它时,出现以下错误AttributeError: __exit__
。是什么赋予了?有什么想法吗?尽管找不到令人满意的解决方案,但这里有许多类似的问题。下面显示了到目前为止我已尝试过的操作:
以下失败:
import shelve
with shelve.open('spam.db') as db:
db['key'] = 'value'
print(db['key'])
错误信息:
Traceback (most recent call last):
File "D:\arbitrary_path_to_script\nf_shelve_test.py", line 3, in <module>
with shelve.open('spam.db') as db:
AttributeError: __exit__
[Finished in 0.1s with exit code 1]
以下作品:
import shelve
db = shelve.open('spam.db')
db['key'] = 'value'
print(db['key'])
db.close()
并输出预期的:
value
[Finished in 0.1s]
打印货架模块路径
import shelve
print(shelve)
地点:
<module 'shelve' from 'C:\\Python33\\lib\\shelve.py'>
[Finished in 0.1s]
最佳答案
在Python 3.3中,shelve.open()
不是上下文管理器,因此不能在with
语句中使用。 with
语句期望存在__enter__
and __exit__
methods;您看到的错误是因为没有这样的方法。
您可以在此处使用contextlib.closing()
将shelve.open()
结果包装在上下文管理器中:
from contextlib import closing
with closing(shelve.open('spam.db')) as db:
或者,升级到Python 3.4,将必需的上下文管理器方法添加到返回值
shelve.open()
。从shelve.Shelve
documentation:在版本3.4中进行了更改:添加了上下文管理器支持。