想要更新/修改搁置中的密钥值

时间:2015-11-19 10:21:54

标签: python python-2.7 shelve

我有一个数据(即{'/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()

1 个答案:

答案 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()上写回;这可以使持久化字典中的可变条目变得更容易,但是,如果访问了许多条目,它可能会占用大量的内存用于缓存,并且它可以使关闭操作非常慢,因为所有访问的条目都被写回(没有办法确定哪些访问的条目是可变的,哪些实际上是变异的。)