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

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

文字列を返す場合、その文字列は通常通りに pickle 化されるグローバル変数 の名前を指しています。__reduce__ の返す文字列は、 モジュールにからみてオブジェクトのローカルな名前でなければなりません; pickle モジュールはモジュールの名前空間を検索して、オブジェクトの 属するモジュールを決定します。

タプルを返す場合、タプルの要素数は 2 から 5 でなければなりません。 オプションの要素は省略したり None を指定したりできます。 各要素の意味づけは以下の通りです:

リリース 2.3 で撤廃されました。 引数のタプルを使ってください。

__reduce__ を実装する場合、プロトコルのバージョンを 知っておくと便利なことがあります。これは __reduce__ の 代わりに__reduce_ex__ を使って実現できます。 __reduce_ex__ が定義されている場合、 __reduce__ よりも優先して呼び出されます (以前のバージョンとの互換性のために __reduce__ を残しておいてもかまいません)。 __reduce_ex__ はプロトコルのバージョンを表す 整数の引数を一つ伴って呼び出されます。

object クラスでは __reduce____reduce_ex__ の両方を定義しています。とはいえ、 サブクラスで __reduce__ をオーバライドしており、 __reduce_ex__ をオーバライドしていない場合には、 __reduce_ex__ の実装がそれを検出して __reduce__ を呼び出すようになっています。

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

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

ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。