marshal — Внутренняя сериализация объектов Python


Этот модуль содержит функции, которые могут считывать и записывать значения Python в двоичном формате. Этот формат специфичен для Python, но не зависит от проблем с архитектурой компьютера (например, вы можете записать значение Python в файл на ПК, перенести файл в Sun и прочитать его там). Детали формата специально не задокументированы; он может меняться в зависимости от версии Python (хотя это происходит редко). [1]

Это не обычный модуль «сохранения». Общие сведения о сохранении и передаче объектов Python с помощью вызовов RPC приведены в модулях pickle и shelve. Модуль marshal существует в основном для поддержки чтения и записи «псевдокомпилированного» кода для модулей Python из файлов .pyc. Таким образом, разработчики Python оставляют за собой право изменять формат marshal обратно несовместимыми способами, если возникнет необходимость. Если вы выполняете сериализацию и десериализацию объектов Python, используйте вместо этого модуль pickle - производительность сопоставима, независимость от версии гарантирована, а pickle поддерживает значительно более широкий диапазон объектов, чем marshal.

Предупреждение

Модуль marshal не предназначен для защиты от ошибочных или злонамеренно созданных данных. Никогда не разглашайте данные, полученные из ненадежного или неаутентифицированного источника.

Поддерживаются не все типы объектов Python; как правило, этот модуль может записывать и считывать только те объекты, значение которых не зависит от конкретного вызова Python. Поддерживаются следующие типы: логические значения, целые числа, числа с плавающей запятой, комплексные числа, строки, байты, байтовые массивы, кортежи, списки, наборы, замороженные наборы, словари и объекты кода, при этом следует понимать, что кортежи, списки, наборы, замороженные наборы и словари поддерживаются только до тех пор, пока значения содержащиеся в нем данные сами по себе являются поддерживаемыми. Синглтоны None, Ellipsis и StopIteration также можно сортировать и отменять сортировку. Для формата версии ниже 3 рекурсивные списки, наборы и словари не могут быть записаны (см. ниже).

Существуют функции, которые читают/записывают файлы, а также функции, работающие с байтоподобными объектами.

Модуль определяет эти функции:

marshal.dump(value, file[, version])

Запишите значение в открытый файл. Значение должно быть поддерживаемого типа. Файл должен быть с возможностью записи binary file.

Если значение имеет (или содержит объект, который имеет) неподдерживаемый тип, возникает исключение ValueError, но в файл также будут записаны ненужные данные. Объект не будет должным образом прочитан обратно load().

Аргумент version указывает формат данных, который должен использоваться dump (см. ниже).

Создает auditing event marshal.dumps с аргументами value, version.

marshal.load(file)

Считайте одно значение из открытого файла и возвращайте его. Если допустимое значение не было прочитано (например, из-за того, что данные имеют несовместимый формат marshal для другой версии Python), поднимите значение EOFError, ValueError или TypeError. Файл должен быть удобочитаемым binary file.

Выдает auditing event marshal.load без каких-либо аргументов.

Примечание

Если объект, содержащий неподдерживаемый тип, был упорядочен с помощью dump(), load(), то он заменит None на тип, не подлежащий удалению.

Изменено в версии 3.10: Раньше этот вызов вызывал событие аудита code.__new__ для каждого объекта кода. Теперь он вызывает одно событие marshal.load для всей операции загрузки.

marshal.dumps(value[, version])

Возвращает объект bytes, который будет записан в файл с помощью dump(value, file). Значение должно быть поддерживаемого типа. Вызывает исключение ValueError, если value имеет (или содержит объект, который имеет) неподдерживаемый тип.

Аргумент version указывает формат данных, который должен использоваться dumps (см. ниже).

Создает auditing event marshal.dumps с аргументами value, version.

marshal.loads(bytes)

Преобразуйте bytes-like object в значение. Если допустимое значение не найдено, увеличьте значение EOFError, ValueError или TypeError. Дополнительные байты во входных данных игнорируются.

Создает auditing event marshal.loads с аргументом bytes.

Изменено в версии 3.10: Раньше этот вызов вызывал событие аудита code.__new__ для каждого объекта кода. Теперь он вызывает одно событие marshal.loads для всей операции загрузки.

Кроме того, определены следующие константы:

marshal.version

Указывает формат, используемый модулем. Версия 0 - это исторический формат, версия 1 использует встроенные строки, а версия 2 использует двоичный формат для чисел с плавающей запятой. Версия 3 добавляет поддержку создания экземпляров объектов и рекурсии. Текущая версия - 4.

Сноски

Вернуться на верх