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

Класс Pickler() модуля pickle в Python

Запись потока данных pickle

Синтаксис:

import pickle

pkl = pickle.Pickler(file, protocol=None, *, \
                   fix_imports=True, buffer_callback=None)

Параметры:

  • file - файлоподобный объект,
  • protocol=None - протокол сериализации,
  • fix_imports=True - сопоставление данных Python2 и Python3,
  • buffer_callback=None - сериализация буфера как часть потока pickle.

Возвращаемое значение:

  • нет.

Описание:

Класс Pickler() модуля pickle берет двоичный файл для записи потока данных pickle.

Необязательный аргумент protocol - целое число, указывает сборщику использовать данный протокол. Поддерживаемые протоколы от 0 до pickle.HIGHEST_PROTOCOL. Если не указан, по умолчанию используется pickle.DEFAULT_PROTOCOL. Если указано отрицательное число, выбирается pickle.HIGHEST_PROTOCOL.

Аргумент file должен иметь метод fp.write(), который принимает один байтовый аргумент. Таким образом, это может быть файл на диске, открытый для записи байтов, экземпляр io.BytesIO() или любой другой пользовательский объект, соответствующий этому интерфейсу.

Если аргумент fix_imports имеет значение True, а протокол меньше 3, то pickle попытается сопоставить новые имена Python3 со старыми именами модулей, используемыми в Python2, так что поток данных pickle будет доступен для чтения в Python2.

Если аргумент buffer_callback=None (по умолчанию), то представления буфера сериализуются в файл как часть потока pickle.

Если buffer_callback не None, то он может быть вызван любое количество раз с представлением буфера. Если обратный вызов возвращает ложное значение, например None, то данный буфер находится вне диапазона. В противном случае буфер сериализуется внутри полосы, то есть внутри потока pickle.

Если buffer_callback не равен None и protocol=None или меньше 5, то будет ошибка.

Методы класса pickle.Pickler().

pkl.dump(obj):

Методы pkl.dump(obj) записывает упакованное представление obj в объект открытого файла, указанный в конструкторе.

>>> import pickle, pprint
>>> data = {'a': [1, 2.0, 3, 4+6j],
...          'b': ('string', u'Unicode string'),
...          'c': None}

# упаковываем объекты Python
>>> with open('data.pkl', 'wb') as fp:
...     pickle.Pickler(fp).damp(data)

# восстанавливаем объекты Python
>>> with open('data.pkl', 'rb') as fp:
...     a = pickle.Unpickler(fp).load()

>>> pprint.pprint(a, width=60)
# {'a': [1, 2.0, 3, (4+6j)],
# 'b': ('string', 'Unicode string'),
# 'c': None}

pkl.persistent_id(obj):

Методы pkl.persistent_id(obj) по умолчанию ничего не делает. Он существует для того, что бы подкласс мог переопределить его.

Если pkl.persistent_id() возвращает None, то obj выбирается как обычно. Любое другое значение заставляет pickle.Pickler() выдавать возвращаемое значение в качестве постоянного идентификатора для obj. Значение этого постоянного идентификатора должно быть определено с помощью pickle.Unpickler.persistent_load(). Обратите внимание, что значение, возвращаемое функцией pkl.persistent_id(), само по себе не может иметь постоянного идентификатора.

Смотрите в качестве примера раздел "Cохранение внешних объектов в pickler"

pkl.dispatch_table:

Для объекта pickler.Pickler() таблица диспетчеризации dispatch_table - это реестр, содержащий функции сокращения, которые мы можем объявить с помощью copyreg.pickle(). Это словарь, который имеет классы в качестве ключей и функции сокращения в качестве значений. Функция сокращения принимает один аргумент связанного класса и должны соответствовать таким же интерфейсом, как метод __reduce__().

По умолчанию объект pickler не имеет атрибут pkl.dispatch_table и вместо этого он будет использовать глобальную таблицу диспетчеризации, управляемую модулем copyreg. Чтобы настроить выборку для конкретного объекта pickler, можно для него установить атрибут dispatch_table похожий на dict. Если подкласс Pickler имеет атрибут pkl.dispatch_table, то он будет использоваться в качестве таблицы диспетчеризации по умолчанию для экземпляров этого класса.

Смотрите в качестве примера раздел "Таблицы диспетчеризации объекта pickler".

pkl.reducer_override(self, obj):

Специальная таблица, которую можно определить в подклассах Pickler(). Этот метод имеет приоритет над любой таблицей диспетчеризации в pkl.dispatch_table. Она должна соответствовать тому же интерфейсу, что и метод __reduce__() и может (необязательно) возвращать NotImplemented для зарегистрированных сокращений в pkl.dispatch_table для получения obj.

Подробный пример смотрите в разделе "Извлечение функций и классов по именам в pickle в Python".