## 3.17.1 制限事項

- どのデータベースパッケージが使われるか (例えば `dbm`、 `gdbm`、`bsddb`) は、どのインタフェースが 利用可能かに依存します。従って、データベースを `dbm` を使って直接開く方法は安全ではありません。データベースはまた、 `dbm` が使われた場合 (不幸なことに) その制約に縛られます -- これはデータベースに 記録されたオブジェクト (の pickle 化された表現) はかなり小さく なければならず、キー衝突が生じた場合に、稀にデータベースを更新 することができなくなるということを意味します。

- 実装に依存して、永続化した辞書を閉じるときには、変更がディスクに 書き込まれるかもしれないし、必ずしも書き込まれないかもしれません。 `Shelf` クラスの `__del__` メソッドは `close` メソッドを呼び出すので、プログラマは通常この作業を明示的に行う必要は ありません。

- `shelve` モジュールは、シェルフに置かれたオブジェクトの 並列した 読み出し/書き込みアクセスをサポートしません (複数の同時読み出しアクセスは安全です)。あるプログラムが書き込み ために開かれたシェルフを持っているとき、他のプログラムは そのシェルフを読み書きのために開いてはいけません。この問題を 解決するために Unix のファイルロック機構を使うことができますが、 この機構は Unix のバージョン間で異なり、使われている データベースの実装について知識が必要となります。

class `Shelf`( | dict[, protocol=None[, writeback=False[, binary=None]]])

  `UserDict.DictMixin` のサブクラスで、pickle 化された値を dict オブジェクトに保存します。

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

  writeback パラメタが True に設定されていれば、アクセスされたすべての エントリはメモリ上にキャッシュされ、ファイルを閉じる際に書き戻されます; この機能により、可変のエントリに対して自然な操作が可能になりますが、 さらに多くのメモリを消費し、辞書をファイルと同期して閉じる際に長い時間が かかるようになります。

class `BsdDbShelf`( | dict[, protocol=None[, writeback=False[, binary=None]]])

  `Shelf` のサブクラスで、`first`、`next`、 `previous`、 `last` および `set_location` メソッドを公開しています。これらのメソッドは `bsddb` モジュールでは 利用可能ですが、他のデータベースモジュールでは利用できません。 コンストラクタに渡された dict オブジェクトは上記のメソッドを サポートしていなくてはなりません。通常は、`bsddb.hashopen`、 `bsddb.btopen` または `bsddb.rnopen` のいずれか を呼び出して得られるオブジェクトが条件を満たしています。オプションの protocol、 writeback、および binary パラメタは `Shelf` クラスにおけるパラメタと同様に解釈されます。

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

  `Shelf` のサブクラスで、辞書様オブジェクトの代わりに filename を受理します。根底にあるファイルは `anydbm.open` を使って開かれます。デフォルトでは、 ファイルは読み書き可能な状態で開かれます。オプションの flag パラメタは `open` 関数におけるパラメタと同様に解釈されます。 オプションの protocol、 writeback、および binary パラメタは `Shelf` クラスにおけるパラメタと同様に解釈されます。