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

marshal.md

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

1> **Источник:** https://python-all.ru/3.4/c-api/marshal.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# Поддержка маршалинга данных89Эти функции позволяют коду на C работать с сериализованными объектами, используя тот же формат данных, что и модуль [`marshal`](https://python-all.ru/3.4/library/marshal.html#module-marshal). Имеются функции для записи данных в формат сериализации, а также дополнительные функции, которые можно использовать для чтения данных обратно. Файлы для хранения маршалированных данных должны открываться в двоичном режиме.1011Числовые значения хранятся с младшим байтом первым.1213Модуль поддерживает две версии формата данных: версия 0 – историческая версия, версия 1 использует интернированные строки в файле и при демаршалинге. Версия 2 использует двоичный формат для чисел с плавающей точкой. *Py\_MARSHAL\_VERSION* указывает текущий формат файла (в настоящее время 2).1415#### `void PyMarshal_WriteLongToFile(long value, FILE *file, int version)`1617Маршалирует целое число `long`, *value*, в *file*. Записываются только младшие 32 бита *value*, независимо от размера нативного типа `long`. *version* указывает формат файла.1819#### `void PyMarshal_WriteObjectToFile(PyObject *value, FILE *file, int version)`2021Маршалирует объект Python, *value*, в *file*. *version* указывает формат файла.2223#### `PyObject* PyMarshal_WriteObjectToString(PyObject *value, int version)`2425*Возвращаемое значение: новая ссылка.*2627Возвращает строковый объект, содержащий маршалированное представление *value*. *version* указывает формат файла.2829Следующие функции позволяют считывать маршалированные значения обратно.3031XXX А как насчёт обнаружения ошибок? Похоже, что чтение за концом файла всегда приводит к отрицательному числовому значению (там, где это имеет смысл), но неясно, будут ли отрицательные значения корректно обрабатываться, если ошибки нет. Как определить это правильно? Следует ли записывать только неотрицательные значения с помощью этих процедур?3233#### `long PyMarshal_ReadLongFromFile(FILE *file)`3435Возвращает значение типа `long` в языке C из потока данных в `FILE*`, открытом для чтения. С помощью этой функции можно прочитать только 32-битное значение, независимо от нативного размера `long`.3637При ошибке вызывает исключение и возвращает `-1`.3839#### `int PyMarshal_ReadShortFromFile(FILE *file)`4041Возвращает значение типа `short` в языке C из потока данных в `FILE*`, открытом для чтения. С помощью этой функции можно прочитать только 16-битное значение, независимо от нативного размера `short`.4243При ошибке вызывает исключение и возвращает `-1`.4445#### `PyObject* PyMarshal_ReadObjectFromFile(FILE *file)`4647*Возвращаемое значение: новая ссылка.*4849Возвращает объект Python из потока данных в `FILE*`, открытом для чтения.5051В случае ошибки устанавливается соответствующее исключение ([`EOFError`](https://python-all.ru/3.4/library/exceptions.html#EOFError) или [``TypeError](https://python-all.ru/3.4/library/exceptions.html#TypeError)) и возвращается *NULL*.5253#### `PyObject* PyMarshal_ReadLastObjectFromFile(FILE *file)`5455*Возвращаемое значение: новая ссылка.*5657Возвращает объект Python из потока данных в `FILE*`, открытом для чтения. В отличие от [`PyMarshal_ReadObjectFromFile()`](https://python-all.ru/3.4/c-api/marshal.html#c.PyMarshal_ReadObjectFromFile), эта функция предполагает, что из файла больше не будет читаться никаких объектов, что позволяет ей агрессивно загружать данные файла в память, чтобы десериализация могла работать с данными из памяти, а не читать по одному байту из файла. Используйте этот вариант, только если вы уверены, что больше ничего из файла читать не будете.5859В случае ошибки устанавливается соответствующее исключение ([`EOFError`](https://python-all.ru/3.4/library/exceptions.html#EOFError) или [`TypeError`](https://python-all.ru/3.4/library/exceptions.html#TypeError)) и возвращается *NULL*.6061#### `PyObject* PyMarshal_ReadObjectFromString(const char *string, Py_ssize_t len)`6263*Возвращаемое значение: новая ссылка.*6465Возвращает объект Python из потока данных в символьном буфере, содержащем *len* байт, на который указывает *string*.6667В случае ошибки устанавливается соответствующее исключение ([`EOFError`](https://python-all.ru/3.4/library/exceptions.html#EOFError) или [`TypeError`](https://python-all.ru/3.4/library/exceptions.html#TypeError)) и возвращается *NULL*.68