Сообщить об ошибке.

Таблицы диспетчеризации объекта pickler

Если кто-то хочет настроить упаковку классов, в которые вносились изменения, при этом не нарушая какой-либо другой код, который зависит от сохраненных тех же оригинальных классов (без изменения), тогда можно создать pickle.Pickler() с пользовательской таблицей диспетчеризации. Эта таблица будет сохранять измененные объекты под другими именами.

Глобальная таблица диспетчеризации pickle.Pickler() управляемая модулем copyreg и доступна как атрибут copyreg.dispatch_table. Следовательно можно выбрать использование модифицированной копии copyreg.dispatch_table в качестве пользовательской таблицей диспетчеризации.

В качестве примера посмотрите следующий псевдокод:

f = io.BytesIO()
p = pickle.Pickler(f)
p.dispatch_table = copyreg.dispatch_table.copy()
p.dispatch_table[SomeClass] = reduce_SomeClass

Создает экземпляр pickle.Pickler() с закрытой таблицей диспетчеризации, которая специально обрабатывает класс SomeClass. В качестве альтернативы, код:

class MyPickler(pickle.Pickler):
    dispatch_table = copyreg.dispatch_table.copy()
    dispatch_table[SomeClass] = reduce_SomeClass
f = io.BytesIO()
p = MyPickler(f)

Делает то же самое, но все экземпляры MyPickler() по умолчанию будут использовать одну и ту же таблицу диспетчеризации. Эквивалентный код с использованием модуля copyreg.

copyreg.pickle(SomeClass, reduce_SomeClass)
f = io.BytesIO()
p = pickle.Pickler(f)