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

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

- `None`、 `True`、および `False`

- 整数、長整数、浮動小数点数、複素数

- 通常文字列および Unicode 文字列

- pickle 化可能なオブジェクトからなるタプル、リスト、集合および辞書

- モジュールのトップレベルで定義されている関数

- モジュールのトップレベルで定義されている組込み関数

- モジュールのトップレベルで定義されているクラス

- `__dict__` または `__setstate__()` を pickle 化 できる上記クラスのインスタンス (詳細は 13.1.5 節を 参照してください)

pickle 化できないオブジェクトを pickle 化しようとすると、 `PicklingError` 例外が送出されます; この例外が起きた 場合、背後のファイルには未知の長さのバイト列が書き込まれて しまいます。 極端に再帰的なデータ構造を pickle 化しようとした場合には 再帰の深さ制限を越えてしまうかもしれず、この場合には `RuntimeError` が 送出されます。この制限は、`sys.setrecursionlimit()` で 慎重に上げていくことは可能です。

(組み込みおよびユーザ定義の) 関数は、値ではなく ``完全記述された'' 参照名として pickle 化されるので注意してください。これは、 関数の定義されているモジュールの名前と一緒と併せ、関数名 だけが pickle 化されることを意味します。 関数のコードや関数の属性は何も pickle 化されません。 従って、定義しているモジュールは unpickle 化環境で import 可能で なければならず、そのモジュールには指定されたオブジェクトが含まれて いなければなりません。そうでない場合、例外が送出されます 28 。

クラスも同様に名前参照で pickle 化されるので、unpickle 化環境には 同じ制限が課せられます。クラス中のコードやデータは何も pickle 化 されないので、以下の例ではクラス属性 `attr` が unpickle 化環境 で復元されないことに注意してください:

    class Foo:
        attr = 'a class attr'

    picklestring = pickle.dumps(Foo)

pickle 化可能な関数やクラスがモジュールのトップレベルで定義されて いなければならないのはこれらの制限のためです。

同様に、クラスのインスタンスが pickle 化された際、そのクラスの コードおよびデータはオブジェクトと一緒に pickle 化されることは ありません。インスタンスのデータのみが pickle 化されます。 この仕様は、クラス内のバグを修正したりメソッドを追加した後でも、 そのクラスの以前のバージョンで作られたオブジェクトを読み出せるように 意図的に行われています。あるクラスの多くのバージョンで使われる ような長命なオブジェクトを作ろうと計画しているなら、 そのクラスの `__setstate__()` メソッドによって適切な変換が 行われるようにオブジェクトのバージョン番号を入れておくとよいかも しれません。

#### Footnotes

... いなければなりません。そうでない場合、例外が送出されます 28
  送出される例外は `ImportError` や `AttributeError` になるはずですが、他の例外も 起こりえます