Типичные сценарии использования pickle в Python

Я посмотрел документацию pickle , но я не понимаю, где полезно использовать pickle.

Каковы некоторые распространенные варианты использования для pickle? pickle?

127
задан smci 19 May 2014 в 01:44
поделиться

3 ответа

Некоторые варианты использования, с которыми я столкнулся:

1) сохранение данных о состоянии программы на диск, чтобы она могла продолжить работу с того места, где была остановлена ​​при перезапуске (постоянство)

2) отправка данных Python через TCP-соединение в многоядерной или распределенной системе (маршаллинг)

3) хранение объектов Python в базе данных

4) преобразование произвольного объекта Python в строку, чтобы его можно было использовать в качестве ключ словаря (например, для кеширования и запоминания).

Есть некоторые проблемы с последним - два идентичных объекта могут быть маринованы и в результате получатся разные строки - или даже один и тот же объект, дважды маринованный, может иметь разные представления. Это потому, что рассол может включать информацию о счетчике ссылок.

Подчеркнем комментарий @lunaryorn - вам никогда не следует извлекать строку из ненадежного источника, поскольку тщательно созданный pickle может выполнить произвольный код в вашей системе. Например, см. https://blog.nelhage.com/2011/03/exploiting-pickle/

56
ответ дан 24 November 2019 в 00:48
поделиться

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

7
ответ дан 24 November 2019 в 00:48
поделиться

Пример минимального пути туда и обратно ..

>>> import pickle
>>> a = Anon()
>>> a.foo = 'bar'
>>> pickled = pickle.dumps(a)
>>> unpickled = pickle.loads(pickled)
>>> unpickled.foo
'bar'

Редактировать: но что касается вопроса о реальных примерах травления, возможно наиболее продвинутое использование травления ( вам придется копаться в источнике довольно глубоко) - это ZODB: http://svn.zope.org/

В противном случае PyPI упоминает несколько: http://pypi.python.org/pypi?:action=search&term=pickle&submit=search

Я лично видел несколько примеров отправки по сети маринованных объектов в качестве простого в использовании протокола сетевой передачи.

10
ответ дан 24 November 2019 в 00:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: