以下の型は pickle 化できます:
None
、 True
、および False
pickle 化できないオブジェクトを pickle 化しようとすると、 PicklingError 例外が送出されます; この例外が起きた 場合、背後のファイルには未知の長さのバイト列が書き込まれて しまいます。 極端に再帰的なデータ構造を pickle 化しようとした場合には 再帰の深さ制限を越えてしまうかもしれず、この場合には RuntimeError が 送出されます。この制限は、sys.setrecursionlimit() で 慎重に上げていくことは可能です。
(組み込みおよびユーザ定義の) 関数は、値ではなく ``完全記述された'' 参照名として pickle 化されるので注意してください。これは、 関数の定義されているモジュールの名前と一緒と併せ、関数名 だけが pickle 化されることを意味します。 関数のコードや関数の属性は何も pickle 化されません。 従って、定義しているモジュールは unpickle 化環境で import 可能で なければならず、そのモジュールには指定されたオブジェクトが含まれて いなければなりません。そうでない場合、例外が送出されます 13.4 。
クラスも同様に名前参照で pickle 化されるので、unpickle 化環境には
同じ制限が課せられます。クラス中のコードやデータは何も pickle 化
されないので、以下の例ではクラス属性 attr
が unpickle 化環境
で復元されないことに注意してください:
class Foo: attr = 'a class attr' picklestring = pickle.dumps(Foo)
pickle 化可能な関数やクラスがモジュールのトップレベルで定義されて いなければならないのはこれらの制限のためです。
同様に、クラスのインスタンスが pickle 化された際、そのクラスの コードおよびデータはオブジェクトと一緒に pickle 化されることは ありません。インスタンスのデータのみが pickle 化されます。 この仕様は、クラス内のバグを修正したりメソッドを追加した後でも、 そのクラスの以前のバージョンで作られたオブジェクトを読み出せるように 意図的に行われています。あるクラスの多くのバージョンで使われる ような長命なオブジェクトを作ろうと計画しているなら、 そのクラスの __setstate__() メソッドによって適切な変換が 行われるようにオブジェクトのバージョン番号を入れておくとよいかも しれません。