### 3.14.5.2 拡張型の pickle 化および unpickle 化

`Pickler` が全く未知の型の -- 拡張型のような -- オブジェクトに 遭遇した場合、pickle 化方法のヒントとして 2 個所を探します。 第一は `__reduce__()` メソッドを実装しているかどうかです。 もし実装されていれば、pickle 化時に `__reduce__()` メソッド が引数なしで呼び出され、この呼び出しに対しては文字列またはタプルの どちらかが返されなくてはなりません。

文字列が返された場合、文字列は通常通りに pickle 化されるグローバルな 変数を表します。タプルが返される場合、タプルの長さは 2 または 3 でなければならず、以下のような意味構成になっていなければなりません:

- 呼び出し可能なオブジェクトで、unpickle 化環境において、クラスか、 ``安全なコンストラクタ (safe constructor)'' (下を参照してください) として登録 されているか、属性 `__safe_for_unpickling__` を持ち値が真に 設定されているような呼び出し可能なオブジェクトでなければなりません。 そうでない場合、 unpickle 化環境で `UnpicklingError` が 送出されます。通常通り、呼び出しオブジェクト自体はその名前が pickle 化されます。

- 呼び出し可能なオブジェクトのための引数からなるタプルか、あるいは `None`
  リリース 2.3 以降で撤廃された仕様です。 引数のタプルを使ってください
  。

- オプションとして、オブジェクトの状態。 3.14.5 節で記述されているようにして、オブジェクトの `__setstate__()` メソッドに渡されます。オブジェクトが `__setstate__()` メソッドを持たない場合、上記のように、 この値は辞書でなくてはならず、オブジェクトの `__dict__` に追加されます。

unpickle 化の際、(上の条件に合致する場合) 呼び出し可能 オブジェクトは引数のタプルを渡して呼び出されます; オブジェクトは unpickle 化されたオブジェクトを返さなくてはなりません。

タプルの二つ目の要素が `None` だった場合、呼び出し可能 オブジェクトを直接呼び出す代わりに、オブジェクトの `__basicnew__()` メソッドが引数なしで呼び出されます。 オブジェクトは同様に unpickle 化されたオブジェクトを返さなければ なりません。

リリース 2.3 以降で撤廃された仕様です。 引数のタプルを使ってください。

pickle 化するオブジェクト上で `__reduce__()` メソッドを実装 する代わりに、`copy_reg` モジュールを使って 呼び出し可能オブジェクトを登録する方法もあります。このモジュール はプログラムに ``縮小化関数 (reduction function)'' と ユーザ定義型のためのコンストラクタを登録する方法を提供します。 縮小化関数は、単一の引数として pickle 化するオブジェクトをとる ことを除き、上で述べた `__reduce__()` メソッドと同じ意味 とインタフェースを持ちます。

登録されたコンストラクタは上で述べたような unpickle 化については ``安全なコンストラクタ'' であると考えられます。