marshal.md
1> **Источник:** https://python-all.ru/3.12/library/marshal.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# `marshal` – внутренняя сериализация объектов Python89---1011Этот модуль содержит функции, которые могут читать и записывать значения Python в двоичном формате. Формат является специфичным для Python, но не зависит от архитектуры машины (например, можно записать значение Python в файл на ПК, перенести файл на Mac и прочитать его там). Детали формата намеренно не документированы; он может меняться между версиями Python (хотя это происходит редко). [\[1\]](https://python-all.ru/3.12/library/marshal.html#id2)1213Это не универсальный модуль «persistence». Для общего сохранения и передачи объектов Python через вызовы RPC см. модули [`pickle`](https://python-all.ru/3.12/library/pickle.html#module-pickle) и [`shelve`](https://python-all.ru/3.12/library/shelve.html#module-shelve). Модуль [`marshal`](https://python-all.ru/3.12/library/marshal.html#module-marshal) существует в основном для поддержки чтения и записи «псевдокомпилированного» кода для модулей Python в файлах `.pyc`. Поэтому разработчики Python оставляют за собой право изменять формат marshal обратно несовместимым образом, если возникнет необходимость. Если требуется сериализовать и десериализовать объекты Python, используйте вместо этого модуль [`pickle`](https://python-all.ru/3.12/library/pickle.html#module-pickle) – производительность сопоставима, гарантируется независимость от версий, а pickle поддерживает существенно более широкий набор объектов, чем marshal.1415> **Предупреждение**16>17> Модуль [`marshal`](https://python-all.ru/3.12/library/marshal.html#module-marshal) не предназначен для защиты от ошибочных или вредоносных данных. Никогда не десериализуйте данные, полученные из ненадёжного или неаутентифицированного источника.1819Не все типы объектов Python поддерживаются; в общем случае модуль может записывать и читать только те объекты, чьё значение не зависит от конкретного запуска Python. Поддерживаются следующие типы: логические значения, целые числа, числа с плавающей точкой, комплексные числа, строки, байты, байтовые массивы, кортежи, списки, множества, неизменяемые множества, словари и объекты кода, при этом следует понимать, что кортежи, списки, множества, неизменяемые множества и словари поддерживаются только при условии, что содержащиеся в них значения также поддерживаются. Синглтоны [`None`](https://python-all.ru/3.12/library/constants.html#None), [`Ellipsis`](https://python-all.ru/3.12/library/constants.html#Ellipsis) и [`StopIteration`](https://python-all.ru/3.12/library/exceptions.html#StopIteration) также могут быть маршалированы и демаршалированы. Для *версии* формата ниже 3 рекурсивные списки, множества и словари не могут быть записаны (см. ниже).2021Существуют функции для чтения/записи файлов, а также функции, работающие с байтоподобными объектами.2223Модуль определяет следующие функции:2425#### `marshal.dump(value, file[, version])`2627Записывает значение в открытый файл. Значение должно быть поддерживаемого типа. Файл должен быть [двоичным файлом для записи](https://python-all.ru/3.12/glossary.html#term-binary-file).2829Если значение имеет (или содержит объект, который имеет) неподдерживаемый тип, возникает исключение [`ValueError`](https://python-all.ru/3.12/library/exceptions.html#ValueError) – но в файл также будут записаны мусорные данные. Объект не будет корректно прочитан обратно функцией [`load()`](https://python-all.ru/3.12/library/marshal.html#marshal.load).3031Аргумент *version* указывает формат данных, который должна использовать `dump` (см. ниже).3233Возбуждает [событие аудита](https://python-all.ru/3.12/library/sys.html#auditing) `marshal.dumps` с аргументами `value`, `version`.3435#### `marshal.load(file)`3637Читает одно значение из открытого файла и возвращает его. Если не удалось прочитать корректное значение (например, из-за того, что данные имеют несовместимый формат marshal другой версии Python), возбуждается [`EOFError`](https://python-all.ru/3.12/library/exceptions.html#EOFError), [`ValueError`](https://python-all.ru/3.12/library/exceptions.html#ValueError) или [`TypeError`](https://python-all.ru/3.12/library/exceptions.html#TypeError). Файл должен быть читаемым [двоичным файлом](https://python-all.ru/3.12/glossary.html#term-binary-file).3839Возбуждает [событие аудита](https://python-all.ru/3.12/library/sys.html#auditing) `marshal.load` без аргументов.4041> **Примечание**42>43> Если объект, содержащий неподдерживаемый тип, был маршализирован с помощью [`dump()`](https://python-all.ru/3.12/library/marshal.html#marshal.dump), то [`load()`](https://python-all.ru/3.12/library/marshal.html#marshal.load) подставит `None` вместо немаршализируемого типа.4445Изменено в версии 3.10: Ранее этот вызов генерировал событие аудита `code.__new__` для каждого объекта кода. Теперь он генерирует одно событие `marshal.load` для всей операции загрузки.4647#### `marshal.dumps(value[, version])`4849Возвращает объект bytes, который был бы записан в файл функцией `dump(value, file)`. Значение должно быть поддерживаемого типа. Возбуждает исключение [`ValueError`](https://python-all.ru/3.12/library/exceptions.html#ValueError), если значение имеет (или содержит объект, который имеет) неподдерживаемый тип.5051Аргумент *version* указывает формат данных, который должна использовать `dumps` (см. ниже).5253Возбуждает [событие аудита](https://python-all.ru/3.12/library/sys.html#auditing) `marshal.dumps` с аргументами `value`, `version`.5455#### `marshal.loads(bytes)`5657Преобразует [байтоподобный объект](https://python-all.ru/3.12/glossary.html#term-bytes-like-object) в значение. Если корректное значение не найдено, возбуждается [`EOFError`](https://python-all.ru/3.12/library/exceptions.html#EOFError), [`ValueError`](https://python-all.ru/3.12/library/exceptions.html#ValueError) или [`TypeError`](https://python-all.ru/3.12/library/exceptions.html#TypeError). Лишние байты во входных данных игнорируются.5859Вызывает [событие аудита](https://python-all.ru/3.12/library/sys.html#auditing) `marshal.loads` с аргументом `bytes`.6061Изменено в версии 3.10: Ранее этот вызов генерировал событие аудита `code.__new__` для каждого объекта кода. Теперь он генерирует одно событие `marshal.loads` для всей операции загрузки.6263Кроме того, определены следующие константы:6465#### `marshal.version`6667Указывает формат, который использует модуль. Версия 0 – исторический формат, версия 1 использует интернированные строки, а версия 2 использует двоичный формат для чисел с плавающей запятой. Версия 3 добавляет поддержку создания экземпляров объектов и рекурсии. Текущая версия – 4.6869Сноски7071\[[1](https://python-all.ru/3.12/library/marshal.html#id1)\]7273Название этого модуля происходит от терминологии, используемой разработчиками Modula-3 (среди прочих), которые используют термин «marshalling» для передачи данных в самодостаточной форме. Строго говоря, «to marshal» означает преобразование некоторых данных из внутреннего представления во внешнее (например, в буфере RPC), а «unmarshalling» – обратный процесс.74