Документация Python неофициальный перевод
Содержание страницы

11.3. copy_reg – Регистрация pickle вспомогательных функцийcopy_reg – Register pickle support functions

Примечание

Модуль copy_reg был переименован в copyreg в Python 3. Инструмент 2to3 автоматически адаптирует импорты при преобразовании исходного кода в Python 3.

Модуль copy_reg предоставляет способ определения функций, используемых при упаковке (pickling) конкретных объектов. Модули pickle, cPickle и copy используют эти функции при упаковке/копировании таких объектов. Модуль предоставляет информацию о конфигурации конструкторов объектов, которые не являются классами. Такие конструкторы могут быть фабричными функциями или экземплярами классов.

copy_reg.constructor(object)

Объявляет object допустимым конструктором. Если object не является вызываемым (и, следовательно, недопустим как конструктор), возбуждается TypeError.

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

Объявляет, что function должна использоваться как функция восстановления для объектов типа type; type не должен быть объектом «классического» класса. (Классические классы обрабатываются иначе; подробнее см. документацию модуля pickle.) function должна возвращать строку или кортеж из двух или трёх элементов.

Необязательный параметр constructor, если указан, представляет собой вызываемый объект, который можно использовать для восстановления объекта при вызове с кортежем аргументов, возвращаемых функцией function во время упаковки. TypeError будет возбуждено, если object является классом или constructor не является вызываемым.

Подробнее об интерфейсе, ожидаемом от function и constructor, см. в модуле pickle.

11.3.1. ПримерExample

Пример ниже демонстрирует, как зарегистрировать функцию 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...