\section{\module{shelve} --- Python オブジェクトの永続化} \declaremodule{standard}{shelve} \modulesynopsis{Python オブジェクトの永続化。} ``シェルフ (shelf, 棚)'' は辞書に似た永続性を持つオブジェクトです。 ``dbm'' データベースとの違いは、シェルフの値 (キーではありません!) は実質上どんな Python オブジェクトにも --- \refmodule{pickle} モジュール が扱えるなら何でも --- できるということです。これにはほとんどの クラスインスタンス、再帰的なデータ型、沢山の共有されたサブオブジェクト を含むオブジェクトが含まれます。キーは通常の文字列です。 \refstmodindex{pickle} インタフェースは以下のコードに集約されています (\code{key} は文字列で、 \code{data} は任意のオブジェクトです): \begin{verbatim} import shelve d = shelve.open(filename) # open, with (g)dbm filename -- no suffix d[key] = data # store data at key (overwrites old data if # using an existing key) data = d[key] # retrieve data at key (raise KeyError if no # such key) del d[key] # delete data stored at key (raises KeyError # if no such key) flag = d.has_key(key) # true if the key exists list = d.keys() # a list of all existing keys (slow!) d.close() # close it \end{verbatim} 上に加えて、shelve は辞書でサポートされている全てのメソッドを サポートします。これによって、辞書ベースのスクリプトを永続性の ある記憶を必要とするスクリプトに容易に移植できます。 以下のような制限があります: \begin{itemize} \item どのデータベースパッケージが使われるか (例えば \refmodule{dbm} とか \refmodule{gdbm}) はどのインタフェースが利用可能かに依存します。 従って、データベースを \refmodule{dbm} を使って直接開くことは安全 ではありません。データベースはまた、\refmodule{dbm} が使われた場合 (不幸なことに) その制約に縛られます --- これはデータベースに 記録されたオブジェクト (の pickle 化された表現) はかなり小さく なければならず、キー衝突が生じた場合に、稀にデータベースを更新 することができなくなるということを意味します。 \refbimodindex{dbm} \refbimodindex{gdbm} \item 実装に依存して、永続化した辞書を閉じるときには、変更がディスクに 書き込まれるかもしれないし、必ずしも書き込まれないかもしれません。 \item \module{shelve} モジュールは、シェルフに置かれたオブジェクトの \emph{並列した} 読み出し/書き込みアクセスをサポートしません (複数の同時読み出しアクセスは安全です)。あるプログラムが書き込み ために開かれたシェルフを持っているとき、他のプログラムは そのシェルフを読み書きのために開いてはいけません。この問題を 解決するために \UNIX{} のファイルロック機構を使うことができますが、 この機構は \UNIX{} のバージョン間で異なり、使われている データベースの実装について知識が必要となります。 \end{itemize} \begin{seealso} \seemodule{anydbm}{\code{dbm} スタイルのデータベースに対する一般的なインタフェース。} \seemodule{dbhash}{BSD \code{db} データベースインタフェース。} \seemodule{dbm}{標準の \UNIX{} データベースインタフェース。} \seemodule{dumbdbm}{\code{dbm} インタフェースの移植性のある実装。} \seemodule{gdbm}{\code{dbm} インタフェースに基づいた GNU データベースインタフェース。} \seemodule{pickle}{\module{shelve} によって使われるオブジェクト整列化機構。} \seemodule{cPickle}{\refmodule{pickle} の高速版。} \end{seealso}