11.3. copy_regpickle サポート関数を登録する

注釈

copy_reg モジュールはPython 3 で copyreg に変更されました。 2to3 ツールが自動的にソースコードの import を変換します。

copy_reg モジュールは特定のオブジェクトを pickle 化するのに使われる関数を定義する手段を提供します。 pickle, cPickle, copy モジュールが、そのオブジェクトを pickle 化したりコピーする際にそれら登録関数を使います。このモジュールは、クラスでないオブジェクトコンストラクタについての設定情報を提供します。クラスでないオブジェクトコンストラクタ、とは、おそらくファクトリ関数かクラスのインスタンスです。

copy_reg.constructor(object)

object を有効なコンストラクタであると宣言します。 object が呼び出し可能でなければ(したがってコンストラクタとして有効でなければ)、 TypeError を発生します。

copy_reg.pickle(type, function[, constructor])

function を、型 type のオブジェクトに対する “リダクション” 関数 として使うことを宣言します。 type は旧スタイルクラスオブジェクトであってはいけません。 (旧スタイルクラスは異なった扱われ方をします。詳細は、 pickle モジュールのドキュメンテーションを参照してください。) function は文字列または二ないし三つの要素を含むタプルを返さなければなりません。

オプションの constructor パラメータが与えられた場合、それは呼び出し可能オブジェクトで、 function が返した引数のタプルとともに pickle 化時に呼ばれてオブジェクトを再構築するために使われます。 object がクラスの場合、または constructor が呼び出し可能でない場合には TypeError が発生します。

functionconstructor の求められるインターフェイスについての詳細は、 pickle モジュールを参照してください。

11.3.1. 例

下記の例は、pickle 関数を登録する方法と、それがどのように使用されるかを示そうとしています:

>>> import copy_reg, copy, pickle
>>> class C(object):
...     def __init__(self, a):
...         self.a = a
...
>>> def pickle_c(c):
...     print("pickling a C instance...")
...     return C, (c.a,)
...
>>> copy_reg.pickle(C, pickle_c)
>>> c = C(1)
>>> d = copy.copy(c)
pickling a C instance...
>>> p = pickle.dumps(c)
pickling a C instance...