marshal
— Внутренняя сериализация объекта Python¶
Модуль содержит функции, которые могут читать и писать Python значения в двоичном формате. Формат специфичен для Python, но не зависит от проблем архитектуры машины (например, можно записать Python значение в файл на ПК, перенести файл на Sun и прочитать его обратно). Подробная информация о формате не документирована специально; он может меняться между версиями Python (весьма редко). [1]
Это не общий модуль «персистентности». Общие сведения о персистентности и передаче
объектов Python через вызовы RPC см. в модулях pickle
и shelve
.
Модуль marshal
существует главным образом, чтобы поддержать чтение и
запись «псевдокомпилированного» кода для модулей Python файлов
.pyc
. Поэтому сопровождающие Python оставляют за собой право изменять
формат маршала по пути обратной несовместимом, если возникнет необходимость.
Если вы сериализовываете и десериализовываете объекты
Python, используйте модуль pickle
вместо этого - исполнение
сопоставимо, независимость вариантов гарантируется, и pickle поддерживает
существенно более широкий диапазон объектов, чем marshal.
Предупреждение
Модуль marshal
не предназначен для защиты от ошибочных или злонамеренно
созданных данных. Никогда не размаршалливайте данные, полученные от ненадежного или
неподтвержденного источника.
Поддерживаются не все типы объектов Python; как правило, этот модуль может
записывать и считывать только объекты, значение которых не зависит от
конкретного вызова Python. Поддерживаются следующие типы: булевы, целые
числа, числа с плавающей запятой, комплексные числа, строки, байты,
байтовые массивы, кортежи, списки, множества, замороженные множества, словари и кодовые
объекты, где следует понимать, что кортежи, списки, наборы, замороженные множества и словари
поддерживаются только при условии, что содержащиеся в них значения
поддерживаются сами. Синглтоны None
, Ellipsis
и StopIteration
также могут
быть сгруппированы и немаркированы. Для формата version ниже 3 рекурсивные
списки, наборы и словари не могут быть записаны (см. ниже).
Существуют функции чтения/записи файлов, а также функции, работающие с байтовыми объектами.
Модуль определяет следующие функции:
-
marshal.
dump
(value, file[, version])¶ Записать значение в открытый файл. Тип значения должен быть поддерживаемым. Файл должен быть записываемым бинарным файлом.
Если значение имеет (или содержит объект, который имеет), неподдержанный тип, поднимется исключение
ValueError
, но данные о мусоре будут также написаны в файл. Объект не будет должным образом прочитан назадload()
.Аргумент version указывает формат данных, который должен использовать
dump
(см. ниже).
-
marshal.
load
(file)¶ Прочитать одино значение из открытого файла и его вернуть. Если никакой действительный значение не прочитан (например, потому что у данных есть несовместимый формат маршала другой версии Python), поднять
EOFError
,ValueError
илиTypeError
. Файл должен быть читаемым бинарным файлом.
-
marshal.
dumps
(value[, version])¶ Возвращает объект байтов, который был бы написан файлу
dump(value, file)
. Тип значение должен быть поддерживаемым. Поднимите исключениеValueError
, если значение имеет (или содержит объект, который имеет), неподдержанный тип.Аргумент version указывает формат данных, который должен использовать
dumps
(см. ниже).
-
marshal.
loads
(bytes)¶ Преобразование байтоподобного объекта в значение. Если найдено неправильное значение, поднимается
EOFError
,ValueError
илиTypeError
. Дополнительные байты на входе игнорируются.
Кроме того, определены следующие константы:
-
marshal.
version
¶ Указывает формат, используемый модулем. Версия 0 - исторический формат, версия 1 разделяет интернированные строки и версия 2 использует двоичный формат для чисел с плавающей запятой. Версия 3 добавляет поддержку экземпляра объекта и рекурсии. Текущая версия - 4.
Сноски
[1] | Название этого модуля происходит от терминологии, используемой разработчиками Modula-3 (среди прочих), которые используют термин «маршаллинг» для доставки данных в автономной форме. Строго говоря, «на маршал» означает преобразование некоторых данных из внутренней формы во внешнюю (в буфере RPC для сущности) и «размаршалливание» для обратного процесса. |