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

marshal.md

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

1> **Источник:** https://python-all.ru/3.0/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.0/library/marshal.html#module-marshal). Существуют функции для записи данных в формат сериализации, а также дополнительные функции для чтения данных обратно. Файлы, используемые для хранения маршалированных данных, должны быть открыты в бинарном режиме.1011Числовые значения хранятся с младшим байтом первым.1213Модуль поддерживает две версии формата данных: версия 0 – историческая, версия 1 разделяет интернированные строки в файле и при демаршалинге. Версия 2 использует бинарный формат для чисел с плавающей точкой. *Py\_MARSHAL\_VERSION* указывает текущий формат файла (на данный момент 2).1415**\[PyMarshal\_WriteLongToFile\]void `PyMarshal_WriteLongToFile`(long *value*, FILE *\*file*, int *version*)**1617Маршалирует целое число типа1819`long`2021,2223*value*2425, в2627*file*2829. Эта функция запишет только младшие 32 бита3031*value*3233, независимо от размера нативного типа3435`long`3637.3839*version*4041указывает формат файла.4243**\[PyMarshal\_WriteObjectToFile\]void `PyMarshal_WriteObjectToFile`([PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*value*, FILE *\*file*, int *version*)**4445Маршалирует объект Python,4647*value*4849, в5051*file*5253.5455*version*5657указывает формат файла.5859**\[PyMarshal\_WriteObjectToString\][PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject)\* `PyMarshal_WriteObjectToString`([PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*value*, int *version*)**6061*Возвращаемое значение: новая ссылка.*6263Возвращает строковый объект, содержащий маршалированное представление *value*. *version* указывает формат файла.6465Следующие функции позволяют считывать маршалированные значения обратно.6667XXX Что насчёт обнаружения ошибок? Похоже, что чтение за концом файла всегда приводит к отрицательному числовому значению (там, где это имеет значение), но неясно, будут ли отрицательные значения корректно обрабатываться, когда ошибки нет. Как правильно определить? Следует ли записывать только неотрицательные значения с помощью этих процедур?6869**\[PyMarshal\_ReadLongFromFile\]long `PyMarshal_ReadLongFromFile`(FILE *\*file*)**7071Возвращает значение C типа7273`long`7475из потока данных в7677`FILE*`7879, открытом для чтения. С помощью этой функции можно прочитать только 32-битное значение, независимо от нативного размера типа8081`long`8283.8485**\[PyMarshal\_ReadShortFromFile\]int `PyMarshal_ReadShortFromFile`(FILE *\*file*)**8687Возвращает значение C типа8889`short`9091из потока данных в9293`FILE*`9495, открытом для чтения. С помощью этой функции можно прочитать только 16-битное значение, независимо от нативного размера типа9697`short`9899.100101**\[PyMarshal\_ReadObjectFromFile\][PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject)\* `PyMarshal_ReadObjectFromFile`(FILE *\*file*)**102103*Возвращаемое значение: новая ссылка.*104105Возвращает объект Python из потока данных в `FILE*`, открытом для чтения. В случае ошибки устанавливает соответствующее исключение ([`EOFError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.EOFError) или [`TypeError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.TypeError)) и возвращает *NULL*.106107**\[PyMarshal\_ReadLastObjectFromFile\][PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject)\* `PyMarshal_ReadLastObjectFromFile`(FILE *\*file*)**108109*Возвращаемое значение: новая ссылка.*110111Возвращает объект Python из потока данных в `FILE*`, открытом для чтения. В отличие от [`PyMarshal_ReadObjectFromFile`](https://python-all.ru/3.0/c-api/marshal.html#PyMarshal_ReadObjectFromFile), эта функция предполагает, что из файла больше не будет читаться никаких объектов, что позволяет агрессивно загружать данные файла в память, чтобы десериализация могла работать с данными в памяти, а не читать по байту из файла. Используйте этот вариант, только если уверены, что больше ничего из файла читать не будете. При ошибке устанавливает соответствующее исключение ([`EOFError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.EOFError) или [`TypeError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.TypeError)) и возвращает *NULL*.112113**\[PyMarshal\_ReadObjectFromString\][PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject)\* `PyMarshal_ReadObjectFromString`(char *\*string*, Py\_ssize\_t *len*)**114115*Возвращаемое значение: новая ссылка.*116117Возвращает объект Python из потока данных в символьном буфере, содержащем *len* байт, на который указывает *string*. При ошибке устанавливает соответствующее исключение ([`EOFError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.EOFError) или [`TypeError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.TypeError)) и возвращает *NULL*.118