3.10 標準モジュール shelve
``shelf''は永続的であり、ディクショナリのようなオブジェクトです。
``dbm''データベースとの違いは、shelfにおける値(キーではない!)は
全てのパイソンオブジェクトであるということです。
これには、ほとんどのクラスインスタンス、recursiveなデータタイプ、
たくさんのサブオブジェクトをもつオブジェクトも含まれます。
値のキーは、通常文字列です。
インターフェース概要 (keyが文字列で, data
が全てのオブジェクトである場合)
import shelve
d = shelve.open(filename) # 指定したファイル名(拡張子なし)の(g)dbmファイルをオープンする
d[key] = data # キーによりデータを保存する(既に存在するキーの場合は
# オーバーライドする
data = d[key] # キーによりデータを取り出す(該当するキーがない場合は
# KeyError となる)
del d[key] # キーによりデータを削除する(該当するキーがない場合は
# KeyError となる)
flag = d.has_key(key) # キーが存在する場合は真
list = d.keys() # 存在する全てのキーのリスト(遅い!)
d.close() # クローズする
制限:
-
どのデータベースパッケージを使用するか(例えばdbmやgdbm)
の選択は、インターフェースが入手可能かどうかに依存しています。
そのため、dbmを直に使用してデータベースをオープンするのは
安全ではありません。
また残念なことに、データベースとしてdbmを使用していた場合、
dbmの仕様上の制限の影響を受けます。
すなわち、データベース内に格納されたピクル化されるオブジェクトは
サイズがかなり小さくなければならず、さらに、まれにキーの衝突が発生して
データベースの更新に失敗することもあります。
-
永続的ディクショナリをクローズするときに、その変更内容をディスクに
フラッシュすることが必要であるか否かについては、実装に依存します。
-
shelveモジュールは、シェルフオブジェクトに対して
同時にread/writeアクセスを行ったときの処理
はサポートしていません。
(複数同時にreadアクセスを行ったときには安全です。)
あるプログラムが書き込みのためにシェルフオブジェクトをオープンしている
時は、他のいかなるプログラムもそのオブジェクトを読み書きのために
オープンするべきではありません。
この問題を解決するために、UNIXのファイルロック機構を使用できます。
しかし、このロック機構はUNIXのバージョンによって異なり、
使用されているデータベースの実装
に関する知識も要求されます。
guido@python.org