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

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

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

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

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

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

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

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

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