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.
Сноски