13.1.4 何を pickle 化したり unpickle 化できるのか?

以下の型は pickle 化できます:

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__() メソッドによって適切な変換が 行われるようにオブジェクトのバージョン番号を入れておくとよいかも しれません。



脚注

... いなければなりません。そうでない場合、例外が送出されます13.4
送出される例外は ImportErrorAttributeError になるはずですが、他の例外も 起こりえます
ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。