# 17 `shelve` -- Python オブジェクトの永続化

``シェルフ (shelf, 棚)'' は辞書に似た永続性を持つオブジェクトです。 ``dbm'' データベースとの違いは、シェルフの値 (キーではありません！) は実質上どんな Python オブジェクトにも -- `pickle` モジュール が扱えるなら何でも -- できるということです。これにはほとんどの クラスインスタンス、再帰的なデータ型、沢山の共有されたサブオブジェクト を含むオブジェクトが含まれます。キーは通常の文字列です。

`open`( | filename[,flag='c'[,protocol=`None`[,writeback=`False`[,binary=`None`]]]])

  永続的な辞書を開きます。指定された filename は、根底にある データベースの基本ファイル名となります。副作用として、filename には拡張子がつけられる場合があり、ひとつ以上のファイルが生成される 可能性もあります。デフォルトでは、根底にあるデータベースファイルは 読み書き可能なように開かれます。オプションの flag パラメタ は `anydbm.open` における flag パラメタと同様に 解釈されます。

  デフォルトでは、値を整列化する際にはバージョン 0 の pickle 化が 用いられます。pickle 化プロトコルのバージョンは protocol パラメタで指定することができます。 バージョン 2.3 で 変更 された仕様: protocol パラメタが追加されました。binary パラメタは撤廃され、 以前のバージョンとの互換性のためにのみ提供されています

  デフォルトでは、永続的な辞書の可変エントリに対する変更をおこなっても、 自動的にファイルには書き戻されません。オプションの writeback パラメタが True に設定されていれば、アクセスされたすべての エントリはメモリ上にキャッシュされ、ファイルを閉じる際に書き戻されます; この機能は永続的な辞書上の可変の要素に対する変更を容易にしますが、 多数のエントリがアクセスされた場合、膨大な量のメモリがキャッシュの ために消費され、アクセスされた全てのエントリを書き戻す (アクセスされた エントリが可変であるか、あるいは実際に変更されたかを決定する方法は 存在しないのです) ために、ファイルを閉じる操作を非常に低速にしてしまいます。

shelve オブジェクトは辞書がサポートする全てのメソッドをサポートしています。 これにより、辞書ベースのスクリプトから永続的な記憶媒体を必要とする スクリプトに容易に移行できるようになります。