Рубрики
Без рубрики

Python Mailling в Lightspeed ⚡

Легкая последняя версия. ⚡. Сегодня я собираюсь покрывать маринование в Python. Очень кратко, маринован … Теги с Python, CodeNewie.

Легкая последняя версия. ⚡.

Сегодня я собираюсь покрывать маринование в Python. Очень кратко, кровообращение – это акт сериализации объектов Python, который будет отправляться в другую программу Python или будет сохранен на диск и прочитан одной и той же программой Python в случае, если она остановилась и перезапущена.

В Python есть 5 различных форматов маринований, каждый из которых новее, чем другие, и они являются версиями 1, 2, 3, 4 и 5. Этот пост будет охватывать только последний формат, версию 5, которая была добавлена в Python 3.4. В частности, Python 2 делает не Поддержите этот формат.

Существует также более простой модуль сериализации, называемый маршал , но это не следует использовать, потому что он не переносится через версии Python, поскольку в основном он используется для файлов .pyc.

Головы вверх: Модуль Scille не защищен, если он используется сам по себе. Поскольку маринованный объект в основном является Python OPCodes, можно сделать последовательность OPCode, злобный маринованный объект, который выбивает интерпретатор или использует уязвимость безопасности. Всегда подпишите ваши выбранные данные с HMAC Модуль Python (в основном разница между http и https, чтобы дать вам аналогию).

HMAC и SSL в целом будет сохранен для будущего поста, и в этом я пойду только Парил Отказ

Почему бы просто не использовать JSON?

Эй, Джосон – это Отличный Формат данных для использования … для данных. Это не может помочь вам, если вы пытаетесь отправить функцию или класс, потому что это не то, что он предназначен для этого. Парил Модуль предназначен для обработки практически каждого объекта Python на языке. Поэтому, хотя вы можете сериализировать списки, словари (также называемые картами и хэш-таблицами), строки и номера в JSON, и сможете прочитать файл, который сделан, поскольку файлы JSON являются читаемыми людьми, это все, что он может сделать.

Свалка

Сериализировать объект, который мы называем Pickle.dump (OBJ, Filehandle,) Отказ Эта функция имеет некоторые другие аргументы, которые вам не нужно знать. Это отбрасывает объект в ручку файла (файл уже должен быть открыт) – подумайте об этом как об этом как капсула времени. протокол = Нет Аргумент означает, что он выберет протокол для использования самостоятельно (обычно последний протокол), но вы можете установить номер протокола в этом аргументе.

При использовании Дамп () Убедитесь, что вы передаете раскрытую ручку файла. Не давайте файл название Или это не будет работать.

Вы хотите фактическое Байты сериализованного объекта вместо того, чтобы сбрасывать его в файл? Вы должны использовать Pickle.dumps (Obj) вместо. Возвращает фактический сериализованный объект.

Нагрузка

Загрузить объект из файла, мы называем Pickle.load (filehandle) Функция, которая возвращает фактический объект Python, который был сериализован. Обратите внимание, что вам нужен способ определить тип маринованного объекта, чтобы вы могли использовать что-то вроде obj = pickle.load (filehandle); Тип (OBJ) чтобы получить тип объекта.

Точно так же можно также загрузить объект из сериализованных байтов вместо файла. Это достигается, позвонив Pickle.loads (Bytes_Object) .

Ловить ошибки

Если по какой-то причине ваши маринованные данные повреждены (или, как мне нравится называть это, избалованные ), то нагрузка () и грузы () поднимет UncicklingeRror Отказ Это исключение, которое вы можете поймать за неопытные сбои. Обратите внимание, что выбранные объекты на самом деле не истекают. Они запутаются, если вы копируете только часть сериализованных данных между прочими вещами. С верхней части головы я пересчитаю, что неполные загрузки выбранных данных могут это тоже.

Также Дамп () и Дампы () бросит Picklingerror. Если объект не может быть замарин.

Скопирован из Python Документация (Не волнуйтесь, если вы не понимаете некоторые из этих типов, пока используемый вами тип можно замариваться):

Что можно замариваться и абонировать?

Следующие типы могут быть замариваются:

  • Нет, правда и ложь

  • целые числа, плавающие точечные номера, комплексные числа

  • Струны, байты, поступления

  • кортежи, списки, наборы и словари, содержащие только подбираемые объекты

  • Функции, определенные на верхнем уровне модуля (с помощью Def, а не лямбда)

  • Встроенные функции, определенные на верхнем уровне модуля

  • классы, которые определяются на верхнем уровне модуля

  • Экземпляры таких классов, чьи Дикт или результат звонка портить () является выбираемым (см. Раздел «Раздел« Макировка экземпляров »для получения подробной информации).

Обратите внимание, что когда Picklingerror брошен Объект, возможно, был частично написан в файл! Это может случиться с Дамп () (но не dumps () Поскольку файлы не участвуют). Итак, я советую вам всегда раскручивать свой объект с Дампы () Получите полученные сериализованные данные, получите файловый дескриптор с Открыть (файл, 'wb') И напишите сериализованные данные в файловый дескриптор, который вы получили.

Хотите поймать оба этих исключения одновременно? Использовать соленый огурец. PickleError вместо.

Сериализация нескольких объектов в файле

У Python есть готовый класс для вас для размещения объекта в файл под названием соленый огурец. Pickler (Filehandle,) , один за раз. Также есть класс для чтения одного объекта одновременно из файла, который называется соленый огурец. Upickler (Filehandle,) Отказ Эти классы возвращают Pickler и Upickler объект соответственно.

Пример может помочь очистить вещи:

>>> import pickle
>>> writefile = open('somefile', 'wb')
>>> p = pickle.Pickler(writefile)
>>> p.dump([1, 2, 3])
>>> p.dump('string')
>>> p.dump(None)
>>> writefile.close()
>>> readfile = open('somefile', 'rb')
>>> u = pickle.Unpickler(readfile)
>>> u.load()
[1, 2, 3]
>>> u.load()
'string'
>>> u.load() # This loads None but the result is not shown.
>>> readfile.seek(0, 0) # Rewinds to beginning of file
0
>>> u.load()
[1, 2, 3]
>>> u.load()
'string'
>>> u.load() # This loads None again.
>>> u.load()
Traceback (most recent call last):
  File "", line 1, in 
EOFError: Ran out of input

Эти классы также имеют различные расширенные параметры, которые здесь не будут обсуждаться. Вам, вероятно, не нужно их знать, так как они в основном полезны для сопровождающих Python.

TL; доктор

Был ли это Парил пост сбивает с толку? Вот как вы начинаете с ним на скорость света :

>>> import pickle
>>> f = open('somefile', 'wb')
>>> pickle.dump({'some': 'dictionary'}, f)
>>> f.close()
>>> f = open('somefile', 'rb')
>>> pickle.load(f)
{'some': 'dictionary'}

Если вы собираетесь отправить объект через сетевое соединение, попробуйте это:

>>> import pickle
>>> obj = pickle.dumps({'some': 'dictionary'})
>>> # Send obj somewhere
>>> # ...
>>> # Some other python instance which received obj
>>> import pickle
>>> pickle.loads(obj)
{'some': 'dictionary'}

И были сделаны

Если вы видите какие-либо осторожные ошибки в этом посте, обязательно уведомите меня, чтобы я мог их исправить.

Оригинал: “https://dev.to/zenulabidin/python-pickling-at-lightspeed-27op”