11.4. marshal – Внутренняя сериализация объектов Python¶marshal – Internal Python object serialization
Этот модуль содержит функции для чтения и записи значений Python в двоичном формате. Формат специфичен для Python, но не зависит от архитектуры машины (например, можно записать значение Python в файл на ПК, перенести файл на Sun и прочитать его там). Детали формата намеренно не документированы; он может меняться между версиями Python (хотя это случается редко). [1]
Это не универсальный «модуль для сохранения данных». Для обычного сохранения и передачи объектов Python через вызовы RPC используйте модули pickle и shelve. Модуль marshal существует в основном для поддержки чтения и записи «псевдокомпилированного» кода модулей Python в файлы .pyc. Поэтому разработчики Python оставляют за собой право изменять формат marshal несовместимым с предыдущими версиями образом, если возникнет необходимость. Если вы сериализуете и десериализуете объекты Python, используйте вместо этого модуль pickle – производительность сопоставима, гарантируется независимость от версии, и pickle поддерживает значительно более широкий диапазон объектов, чем marshal.
Предупреждение
Модуль marshal не предназначен для защиты от ошибочных или вредоносных данных. Не распаковывайте данные, полученные из ненадёжного или неаутентифицированного источника.
Не все типы объектов Python поддерживаются; в общем случае только объекты, значение которых не зависит от конкретного запуска Python, могут быть записаны и прочитаны этим модулем. Поддерживаются следующие типы: логические значения, целые числа, числа с плавающей точкой, комплексные числа, строки, bytes, bytearrays, кортежи, списки, множества, frozensets, словари и объекты кода. При этом следует понимать, что кортежи, списки, множества, frozensets и словари поддерживаются только при условии, что содержащиеся в них значения сами являются поддерживаемыми; а рекурсивные списки, множества и словари записывать не следует (они приведут к бесконечным циклам). Синглтоны None, Ellipsis и StopIteration также могут быть маршализированы и разаршализированы.
Существуют функции для чтения/записи файлов, а также функции, работающие со строками.
Модуль определяет следующие функции:
- marshal.dump(value, file[, version])¶
Записывает значение в открытый файл. Значение должно быть поддерживаемого типа. Файл должен быть открытым файловым объектом, таким как sys.stdout или возвращённым open() или os.popen(). Он должен быть открыт в бинарном режиме ('wb' или 'w+b').
Если значение имеет (или содержит объект, который имеет) неподдерживаемый тип, возбуждается исключение ValueError – но мусорные данные всё равно будут записаны в файл. Объект не будет корректно прочитан обратно с помощью load().
Аргумент version указывает формат данных, который должна использовать dump (см. ниже).
- marshal.load(file)¶
Читает одно значение из открытого файла и возвращает его. Если не удаётся прочитать корректное значение (например, из-за несовместимости формата marshal другой версии Python), возбуждает EOFError, ValueError или TypeError. Файл должен быть открытым файловым объектом, открытым в бинарном режиме ('rb' или 'r+b').
- marshal.dumps(value[, version])¶
Возвращает строку, которая была бы записана в файл функцией dump(value, file). Значение должно быть поддерживаемого типа. Возбуждает исключение ValueError, если значение имеет (или содержит объект, который имеет) неподдерживаемый тип.
Аргумент version указывает формат данных, который должна использовать dumps (см. ниже).
- marshal.loads(string)¶
Преобразует строку в значение. Если корректное значение не найдено, возбуждает EOFError, ValueError или TypeError. Лишние символы в строке игнорируются.
Кроме того, определены следующие константы:
- marshal.version¶
Указывает формат, используемый модулем. Версия 0 – это исторический формат, версия 1 использует интернированные строки, а версия 2 – двоичный формат для чисел с плавающей точкой. Текущая версия – 2.
Сноски
| [1] | Название этого модуля происходит от терминологии, используемой разработчиками Modula-3 (среди прочих), которые используют термин «marshalling» для передачи данных в самодостаточной форме. Строго говоря, «to marshal» означает преобразование некоторых данных из внутреннего представления во внешнее (например, в буфере RPC), а «unmarshalling» – обратный процесс. |