Если кто-то хочет настроить упаковку классов, в которые вносились изменения, при этом не нарушая какой-либо другой код, который зависит от сохраненных тех же оригинальных классов (без изменения), тогда можно создать 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)