marshal – внутренняя сериализация объектов Python¶marshal – Internal Python object serialization
Этот модуль содержит функции, которые могут читать и записывать значения Python в двоичном формате. Формат является специфичным для Python, но не зависит от архитектуры машины (например, можно записать значение Python в файл на ПК, перенести файл на Mac и прочитать его там). Детали формата намеренно не документированы; он может меняться между версиями Python (хотя это происходит редко). [1]
Это не универсальный модуль «персистентности». Для общего сохранения и передачи объектов Python через RPC-вызовы обратитесь к модулям pickle и shelve. Модуль marshal существует в основном для поддержки чтения и записи «псевдокомпилированного» кода для модулей Python в файлах .pyc. Поэтому разработчики Python оставляют за собой право изменять формат marshal обратно несовместимым образом, если возникнет необходимость. Формат объектов кода несовместим между версиями Python, даже если версия формата одинакова. Десериализация объекта кода в неправильной версии Python приводит к неопределенному поведению. Если вы сериализуете и десериализуете объекты Python, используйте вместо этого модуль pickle – производительность сопоставима, гарантируется независимость от версии, и pickle поддерживает значительно более широкий диапазон объектов, чем marshal.
Предупреждение
Модуль marshal не предназначен для защиты от ошибочных или вредоносных данных. Никогда не десериализуйте данные, полученные из ненадёжного или неаутентифицированного источника.
Существуют функции для чтения/записи файлов, а также функции, работающие с байтоподобными объектами.
Поддерживаются не все типы объектов Python; в целом, только объекты, значение которых не зависит от конкретного запуска Python, могут быть записаны и прочитаны этим модулем. Поддерживаются следующие типы:
Строки (
str) иbytes. Байтоподобные объекты, такие какbytearray, маршализируются какbytes.Контейнеры:
tuple,list,set,frozenset, и (начиная сversion5)slice. Следует понимать, что они поддерживаются только в том случае, если содержащиеся в них значения сами поддерживаются. Рекурсивные контейнеры поддерживаются начиная сversion3.Синглтоны
None,EllipsisиStopIteration.Объекты
code, если allow_code равен true. См. примечание выше о зависимости от версии.
Изменено в версии 3.4:
Добавлена версия формата 3, которая поддерживает маршалинг рекурсивных списков, множеств и словарей.
Добавлена версия формата 4, которая поддерживает эффективные представления коротких строк.
Изменено в версии 3.14: Добавлена версия формата 5, которая позволяет маршалинг срезов.
Модуль определяет следующие функции:
- marshal.dump(value, file, version=version, /, *, allow_code=True)¶
Записывает значение в открытый файл. Значение должно быть поддерживаемого типа. Файл должен быть двоичным файлом для записи.
Если значение имеет (или содержит объект, имеющий) неподдерживаемый тип, вызывается исключение
ValueError– но в файл также будут записаны мусорные данные. Объект не будет правильно прочитан обратно функциейload(). Объекты кода поддерживаются только если allow_code равен true.Аргумент version указывает формат данных, который должна использовать
dump(см. ниже).Возбуждает событие аудита
marshal.dumpsс аргументамиvalue,version.Изменено в версии 3.13: Добавлен параметр allow_code.
- marshal.load(file, /, *, allow_code=True)¶
Читает одно значение из открытого файла и возвращает его. Если не удаётся прочитать корректное значение (например, из-за несовместимого формата marshal другой версии Python), возбуждается
EOFError,ValueErrorилиTypeError. Объекты кода поддерживаются только если allow_code равен true. Файл должен быть двоичным файлом для чтения.Возбуждает событие аудита
marshal.loadбез аргументов.Примечание
Если объект, содержащий неподдерживаемый тип, был маршализирован с помощью
dump(), тоload()подставитNoneвместо немаршализируемого типа.Изменено в версии 3.10: Ранее этот вызов возбуждал событие аудита
code.__new__для каждого объекта кода. Теперь он возбуждает одно событиеmarshal.loadдля всей операции загрузки.Изменено в версии 3.13: Добавлен параметр allow_code.
- marshal.dumps(value, version=version, /, *, allow_code=True)¶
Возвращает объект bytes, который был бы записан в файл функцией
dump(value, file). Значение должно быть поддерживаемого типа. Возбуждает исключениеValueError, если значение имеет (или содержит объект, имеющий) неподдерживаемый тип. Объекты кода поддерживаются только если allow_code равен true.Аргумент version указывает формат данных, который должна использовать
dumps(см. ниже).Возбуждает событие аудита
marshal.dumpsс аргументамиvalue,version.Изменено в версии 3.13: Добавлен параметр allow_code.
- marshal.loads(bytes, /, *, allow_code=True)¶
Преобразует байтоподобный объект в значение. Если корректное значение не найдено, возбуждается
EOFError,ValueErrorилиTypeError. Объекты кода поддерживаются только если allow_code равен true. Лишние байты во входных данных игнорируются.Вызывает событие аудита
marshal.loadsс аргументомbytes.Изменено в версии 3.10: Ранее этот вызов генерировал событие аудита
code.__new__для каждого объекта кода. Теперь он генерирует одно событиеmarshal.loadsдля всей операции загрузки.Изменено в версии 3.13: Добавлен параметр allow_code.
Кроме того, определены следующие константы:
- marshal.version¶
Указывает формат, который использует модуль. Версия 0 – это историческая первая версия; последующие версии добавляют новые возможности. Обычно новая версия становится версией по умолчанию при её введении.
Версия
Доступна начиная с
Новые возможности
1
Python 2.4
Совместное использование интернированных строк
2
Python 2.5
Двоичное представление чисел с плавающей запятой
3
Python 3.4
Поддержка создания экземпляров объектов и рекурсии
4
Python 3.4
Эффективное представление коротких строк
5
Python 3.14
Поддержка объектов
slice
Сноски
Эта страница – перевод. Оригинал на английском – docs.python.org. Нашли неточность? Сообщите нам.