marshal
— Внутрішня серіалізація об’єктів Python¶
Цей модуль містить функції, які можуть читати та записувати значення Python у двійковому форматі. Формат є специфічним для Python, але не залежить від проблем архітектури машини (наприклад, ви можете записати значення Python у файл на ПК, перенести файл на Sun і прочитати його там). Деталі формату навмисно недокументовані; він може змінюватися між версіями Python (хоча це відбувається рідко). [1]
Це не загальний модуль «постійності». Для загального збереження та передачі об’єктів Python через виклики RPC див. модулі pickle
і shelve
. Модуль marshal
існує головним чином для підтримки читання та запису «псевдокомпільованого» коду для модулів Python файлів .pyc
. Тому супроводжувачі Python залишають за собою право змінювати формат маршалу зворотно несумісними способами, якщо виникне така потреба. Якщо ви серіалізуєте та десеріалізуєте об’єкти Python, використовуйте натомість модуль pickle
— продуктивність порівнянна, незалежність версії гарантована, а pickle підтримує значно ширший діапазон об’єктів, ніж marshal.
Попередження
Модуль marshal
не призначений для захисту від помилкових або зловмисно створених даних. Ніколи не скасовуйте дані, отримані з ненадійного або неавтентифікованого джерела.
Підтримуються не всі типи об’єктів Python; загалом, тільки ті об’єкти, чиє значення не залежить від конкретного виклику Python, можуть бути записані та прочитані цим модулем. Підтримуються такі типи: логічні значення, цілі числа, числа з плаваючою комою, комплексні числа, рядки, байти, байтові масиви, кортежі, списки, набори, заморожені набори, словники та об’єкти коду, де слід розуміти, що кортежі, списки, набори, заморожені набори і словники підтримуються лише до тих пір, поки підтримуються самі значення, які в них містяться. Синглтони None
, Ellipsis
і StopIteration
також можуть бути маршалізованими та немаршалізованими. Для версії формату, нижчої за 3, не можна писати рекурсивні списки, набори та словники (див. нижче).
Існують функції, які читають/записують файли, а також функції, що працюють з байтоподібними об’єктами.
Модуль визначає такі функції:
- marshal.dump(value, file[, version])¶
Запишіть значення у відкритий файл. Значення має бути підтримуваного типу. Файл має бути записуваним binary file.
Якщо значення має (або містить об’єкт, який має) непідтримуваний тип, виникає виняток
ValueError
— але сміттєві дані також будуть записані у файл. Об’єкт не буде належним чином прочитанийload()
.Аргумент version вказує на формат даних, який має використовувати
damp
(див. нижче).Викликає подію аудиту
marshal.dumps
з аргументамизначення
,версія
.
- marshal.load(file)¶
Прочитати одне значення з відкритого файлу та повернути його. Якщо дійсне значення не зчитується (наприклад, через те, що дані мають несумісний маршальний формат іншої версії Python), викликайте
EOFError
,ValueError
абоTypeError
. Файл має бути читабельним binary file.Викликає подію аудиту
marshal.load
без аргументів.Примітка
Якщо об’єкт, що містить непідтримуваний тип, був маршалований за допомогою
dump()
,load()
замінитьNone
для типу, який не можна маршалювати.Змінено в версії 3.10: Цей виклик використовувався для виклику події аудиту
code.__new__
для кожного об’єкта коду. Тепер він викликає одну подіюmarshal.load
для всієї операції завантаження.
- marshal.dumps(value[, version])¶
Повертає об’єкт bytes, який буде записаний у файл за допомогою
dump(value, file)
. Значення має бути підтримуваного типу. Викликати винятокValueError
, якщо значення має (або містить об’єкт, який має) непідтримуваний тип.Аргумент version вказує формат даних, який мають використовувати
дампи
(див. нижче).Викликає подію аудиту
marshal.dumps
з аргументамизначення
,версія
.
- marshal.loads(bytes)¶
Перетворіть bytes-like object на значення. Якщо дійсне значення не знайдено, підніміть
EOFError
,ValueError
абоTypeError
. Зайві байти у вхідних даних ігноруються.Викликає подію аудиту
marshal.loads
з аргументомbytes
.Змінено в версії 3.10: Цей виклик використовувався для виклику події аудиту
code.__new__
для кожного об’єкта коду. Тепер він викликає одну подіюmarshal.loads
для всієї операції завантаження.
Крім того, визначено такі константи:
- marshal.version¶
Вказує на формат, який використовує модуль. Версія 0 — це історичний формат, версія 1 використовує вбудовані рядки, а версія 2 використовує двійковий формат для чисел з плаваючою комою. Версія 3 додає підтримку екземплярів об’єктів і рекурсії. Поточна версія 4.
Виноски