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

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

Чтение потока данных pickle

Синтаксис:

import pickle

data = pickle.Unpickler(file, *, fix_imports=True, encoding="ASCII", \
                        errors="strict", buffers=None)

Параметры:

  • file - открытый поток данных pickle,
  • fix_imports=True - сопоставление данных Python2 и Python3,
  • encoding="ASCII" - кодировка для чтения данных, генерируемых Python2,
  • errors="strict" - обработчик ошибок декодирования,
  • buffers=None - аргумент buffer_callback указанный при создании объекта pickle.Pickler().

Описание:

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

Версия протокола pickle определяется автоматически, поэтому аргумент протокола не требуется.

Аргумент file должен иметь три метода как в интерфейсе io.BufferedIOBase:

  • метод read(), который принимает целочисленный аргумент,
  • метод readinto(), который принимает аргумент buffers,
  • метод fp.readline(), который не требует аргументов.

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

Необязательные аргументы fix_imports, encoding и errors используются для управления поддержкой совместимости потока pickle, генерируемого Python2.

Если fix_imports имеет значение True, то pickle попытается отобразить старые имена Python2 на новые имена, используемые в Python3.

Аргументы encoding и errors указывают pickle как декодировать 8-битные строковые экземпляры, генерируемые Python2. По умолчанию это 'ASCII' и 'strict' соответственно. Кодировка encoding может быть 'bytes' для чтения этих 8-битных строковых экземпляров как байтовых объектов. Использование encoding='latin1' требуется для извлечения массивов NumPy и экземпляров datetime.datetime(), datetime.date() и datetime.time() генерируемые Python2.

Если аргумент buffers=None (по умолчанию), то все данные, необходимые для десериализации, должны содержаться в потоке pickle. Это означает, что аргумент buffer_callback=None, когда был создан экземпляр pickle.Pickler() или когда вызывался pickle.dump() или pickle.dumps().

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

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

data.load():

Метод data.load() читает упакованное представление объекта pickle из открытого файлового объекта и возвращает указанную в нем иерархию восстановленных объектов.

>>> 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}

data.persistent_load(pid):

Метод data.persistent_load(pid) по умолчанию вызывает исключение UnpicklingError.

Если определен, то data.persistent_load() должен возвращать объект, указанный в постоянном идентификаторе pid. Если обнаружен недопустимый pid, то необходимо вызвать исключение UnpicklingError.

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

data.find_class(module, name):

Метод data.find_class() при необходимости импортирует модуль module и возвращает из него объект с именем name, где аргументы module и name являются объектами str. Обратите внимание, что в отличие от его названия data.find_class() также используется для поиска функций.

Подклассы могут переопределить этот метод, чтобы получить контроль над тем, какие типы объектов и как могут быть загружены, потенциально снижая риски безопасности. В качестве примера смотрите раздел "Распаковка pickle данных из ненадежных источников".

Вызывает событие аудита pickle.find_class с аргументами module и name.