回写

默认情况下,货架不跟踪对易失性对象的修改。这意味着如果更改存储在工具架中的项目的内容,则必须通过再次存储该项目来明确更新工具架。

import shelve

s = shelve.open('test_shelf.db')
try:
    print s['key1']
    s['key1']['new_value'] = 'this was not here before'
finally:
    s.close()

s = shelve.open('test_shelf.db', writeback=True)
try:
    print s['key1']
finally:
    s.close()

在此示例中,‘key1’处的字典不会再次存储,因此当重新打开工具架时,尚未保留更改。

$ python shelve_create.py
$ python shelve_withoutwriteback.py

{'int': 10, 'float': 9.5, 'string': 'Sample data'}
{'int': 10, 'float': 9.5, 'string': 'Sample data'}

要自动捕获存储在工具架中的易失性对象的更改,请在启用了写回的情况下打开工具架。写回标志使架子记住使用内存缓存从数据库检索的所有对象。当货架关闭时,每个缓存对象也会写回数据库。

import shelve

s = shelve.open('test_shelf.db', writeback=True)
try:
    print s['key1']
    s['key1']['new_value'] = 'this was not here before'
    print s['key1']
finally:
    s.close()

s = shelve.open('test_shelf.db', writeback=True)
try:
    print s['key1']
finally:
    s.close()

虽然它减少了程序员错误的可能性,并且可以使对象持久性更加透明,但是在每种情况下都可能不希望使用回写模式。当磁盘架打开时,缓存会消耗额外的内存,并且在关闭时将每个缓存的对象暂停写回数据库可能需要额外的时间。由于无法判断缓存的对象是否已被修改,因此它们都会被回写。如果你的应用程序读取的数据超过了写入数量,那么回写将增加比你想要的更多的开销。

$ python shelve_create.py
$ python shelve_writeback.py

{'int': 10, 'float': 9.5, 'string': 'Sample data'}
{'int': 10, 'new_value': 'this was not here before', 'float': 9.5, 'string': 'Sample data'}
{'int': 10, 'new_value': 'this was not here before', 'float': 9.5, 'string': 'Sample data'}