回寫

預設情況下,貨架不跟蹤對易失性物件的修改。這意味著如果更改儲存在工具架中的專案的內容,則必須通過再次儲存該專案來明確更新工具架。

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'}