Документация Python неофициальный перевод

marshal.md

62 строк · 9.5 КБ · обычная страница · сырой текст · скачать

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