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".