python3

【Python@shelve】shelve にて辞書上の要素の変更について

More than 1 year has passed since last update.

shelve で保存した辞書の要素をそのまま変更すると、当該の要素が更新されない可能性があります。
下記のコード:

with shelve.open("db_name") as db:
    record = db[key]
    record["term"] = new_value

しかしながら、引数のオプション writeback パラメータを True に設定すれば、事象が改善できます。
下記のコード:

with shelve.open('db_name', writeback=True) as db:
    record = db[key]
    record["term"] = new_value

尚、Python 3.6.1 ドキュメントにも記載されていますが、

この機能は永続的な辞書上の可変の要素に対する変更を容易にしますが、多数のエントリがアクセスされた場合、膨大な量のメモリがキャッシュのために消費され、アクセスされた全てのエントリを書き戻す (アクセスされたエントリが可変であるか、あるいは実際に変更されたかを決定する方法は存在しないのです) ために、ファイルを閉じる操作が非常に低速になります。

即ち、使う時に要注意とのことです。

<参考> 12.3. shelve — Python オブジェクトの永続化