marshal.md
1> **Источник:** https://python-all.ru/3.2/library/marshal.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 11.4. [`marshal`](https://python-all.ru/3.2/library/marshal.html#module-marshal) – Внутренняя сериализация объектов Python89Этот модуль содержит функции для чтения и записи значений Python в двоичном формате. Формат специфичен для Python, но не зависит от архитектуры машины (например, можно записать значение Python в файл на ПК, перенести файл на Sun и прочитать его там). Детали формата намеренно не документированы; он может меняться между версиями Python (хотя это случается редко). [\[1\]](https://python-all.ru/3.2/library/marshal.html#id2)1011Это не универсальный «модуль для сохранения данных». Для обычного сохранения и передачи объектов Python через вызовы RPC используйте модули [`pickle`](https://python-all.ru/3.2/library/pickle.html#module-pickle) и [`shelve`](https://python-all.ru/3.2/library/shelve.html#module-shelve). Модуль [`marshal`](https://python-all.ru/3.2/library/marshal.html#module-marshal) существует в основном для поддержки чтения и записи «псевдокомпилированного» кода модулей Python в файлы `.pyc`. Поэтому разработчики Python оставляют за собой право изменять формат marshal несовместимым с предыдущими версиями образом, если возникнет необходимость. Если вы сериализуете и десериализуете объекты Python, используйте вместо этого модуль [`pickle`](https://python-all.ru/3.2/library/pickle.html#module-pickle) – производительность сопоставима, гарантируется независимость от версии, и pickle поддерживает значительно более широкий диапазон объектов, чем marshal.1213> **Предупреждение**14>15> Модуль [`marshal`](https://python-all.ru/3.2/library/marshal.html#module-marshal) не предназначен для защиты от ошибочных или вредоносных данных. Не распаковывайте данные, полученные из ненадёжного или неаутентифицированного источника.1617Не все типы объектов Python поддерживаются; в общем случае только объекты, значение которых не зависит от конкретного запуска Python, могут быть записаны и прочитаны этим модулем. Поддерживаются следующие типы: логические значения, целые числа, числа с плавающей точкой, комплексные числа, строки, bytes, bytearrays, кортежи, списки, множества, frozensets, словари и объекты кода. При этом следует понимать, что кортежи, списки, множества, frozensets и словари поддерживаются только при условии, что содержащиеся в них значения сами являются поддерживаемыми; а рекурсивные списки, множества и словари записывать не следует (они приведут к бесконечным циклам). Синглтоны [`None`](https://python-all.ru/3.2/library/constants.html#None), [`Ellipsis`](https://python-all.ru/3.2/library/constants.html#Ellipsis) и [`StopIteration`](https://python-all.ru/3.2/library/exceptions.html#StopIteration) также могут быть маршализированы и разаршализированы.1819Существуют функции для чтения/записи файлов, а также функции, работающие со строками.2021Модуль определяет следующие функции:2223#### `marshal.dump(value, file[, version])`2425Записывает значение в открытый файл. Значение должно быть поддерживаемого типа. Файл должен быть открытым файловым объектом, таким как `sys.stdout` или возвращённым [`open()`](https://python-all.ru/3.2/library/functions.html#open) или `os.popen()`. Он должен быть открыт в бинарном режиме (`'wb'` или `'w+b'`).2627Если значение имеет (или содержит объект, который имеет) неподдерживаемый тип, возбуждается исключение [`ValueError`](https://python-all.ru/3.2/library/exceptions.html#ValueError) – но мусорные данные всё равно будут записаны в файл. Объект не будет корректно прочитан обратно с помощью [`load()`](https://python-all.ru/3.2/library/marshal.html#marshal.load).2829Аргумент *version* указывает формат данных, который должна использовать `dump` (см. ниже).3031#### `marshal.load(file)`3233Читает одно значение из открытого файла и возвращает его. Если не удаётся прочитать корректное значение (например, из-за несовместимости формата marshal другой версии Python), возбуждает [`EOFError`](https://python-all.ru/3.2/library/exceptions.html#EOFError), [`ValueError`](https://python-all.ru/3.2/library/exceptions.html#ValueError) или [`TypeError`](https://python-all.ru/3.2/library/exceptions.html#TypeError). Файл должен быть открытым файловым объектом, открытым в бинарном режиме (`'rb'` или `'r+b'`).3435> **Примечание**36>37> Если объект, содержащий неподдерживаемый тип, был упакован с помощью [`dump()`](https://python-all.ru/3.2/library/marshal.html#marshal.dump), то [`load()`](https://python-all.ru/3.2/library/marshal.html#marshal.load) подставит `None` вместо нераспаковываемого типа.3839#### `marshal.dumps(value[, version])`4041Возвращает строку, которая была бы записана в файл функцией `dump(value, file)`. Значение должно быть поддерживаемого типа. Возбуждает исключение [`ValueError`](https://python-all.ru/3.2/library/exceptions.html#ValueError), если значение имеет (или содержит объект, который имеет) неподдерживаемый тип.4243Аргумент *version* указывает формат данных, который должна использовать `dumps` (см. ниже).4445#### `marshal.loads(string)`4647Преобразует строку в значение. Если корректное значение не найдено, возбуждает [`EOFError`](https://python-all.ru/3.2/library/exceptions.html#EOFError), [`ValueError`](https://python-all.ru/3.2/library/exceptions.html#ValueError) или [`TypeError`](https://python-all.ru/3.2/library/exceptions.html#TypeError). Лишние символы в строке игнорируются.4849Кроме того, определены следующие константы:5051#### `marshal.version`5253Указывает формат, используемый модулем. Версия 0 – это исторический формат, версия 1 использует интернированные строки, а версия 2 – двоичный формат для чисел с плавающей точкой. Текущая версия – 2.5455Сноски5657| [\[1\]](https://python-all.ru/3.2/library/marshal.html#id1) | Название этого модуля происходит от терминологии, используемой разработчиками Modula-3 (среди прочих), которые используют термин «marshalling» для передачи данных в самодостаточной форме. Строго говоря, «to marshal» означает преобразование некоторых данных из внутреннего представления во внешнее (например, в буфере RPC), а «unmarshalling» – обратный процесс. |58| --- | --- |59