我有一个数据(即{'/domflight': 10, '/intlflight': 20}
),并希望将'/domflight'
的值修改为50
。下面是我试图做的代码,但没有运气。
import shelve
s = shelve.open('/tmp/test_shelf.db')
try:
print s['key1']
s['key1']['/domflight'] = 50
finally:
s.close()
s = shelve.open('/tmp/test_shelf.db', writeback=True)
try:
print s['key1']
finally:
s.close()
答案 0 :(得分:2)
Shelve无法检测嵌套可变对象的更改。在嵌套字典中设置密钥不会触发保存。
重新设置字典:
nested_dict = s['key1']
nested_dict['/domflight'] = 50
s['key1'] = nested_dict
返回s['key1']
的分配会触发保存。
从技术上讲,会发生的事情是s
是具有自定义UserDict.DictMixin
方法的__setitem__
类的子类。直接分配给s
对象中的键会调用该方法保存更改。但是,在密钥下分配嵌套的可变对象不会触发对__setitem__
的调用,因此不会检测到更改,也不会保存任何内容。
这是covered in the documentation:
由于Python语义,架子无法知道何时修改了可变的持久字典条目。默认情况下,修改后的对象在分配到工具架时仅写入 (请参阅Example)。如果可选的 writeback 参数设置为
True
,则所有访问的条目也会缓存在内存中,并在sync()
和close()
上写回;这可以使持久化字典中的可变条目变得更容易,但是,如果访问了许多条目,它可能会占用大量的内存用于缓存,并且它可以使关闭操作非常慢,因为所有访问的条目都被写回(没有办法确定哪些访问的条目是可变的,哪些实际上是变异的。)