Pull to refresh

Comments 45

как-то банально.

статья о консервации объектов и ни слова не сказано про pickle protocol.

у нас объекты это только dict?
Возможно, я чего-то не допонимаю, но про пикл протоколы я рассказал.
Добавил кортежи.
как запиклить кастомный объект? как определяется может ли объект пиклиться?
Запиклится объект или нет — можно выяснить лишь попытавшись запиклить его. Если пикл прошел удачно (т. е. не вылезли ошибки), то и всё остальное тоже будет в порядке.
хорошо, а как добавить поддержку пиклинга в свой объект?
не обязательно, можно «запиклить» объект в файл без ошибок, но он не откроется с другого скрипта если там сохранялся объект
какие требования к неймспейсу когда ты пиклишь и распикливаешь свои объекты?

много в общем вопросов за кадром осталось.
Ограничения по неймспейсам такие же, как и в самом языке (зарезервированные слова и т. д.)
Note that functions (built-in and user-defined) are pickled by ``fully qualified'' name reference, not by value. This means that only the function name is pickled, along with the name of module the function is defined in. Neither the function's code, nor any of its function attributes are pickled. Thus the defining module must be importable in the unpickling environment, and the module must contain the named object, otherwise an exception will be raised3.6.

Similarly, classes are pickled by named reference, so the same restrictions in the unpickling environment apply. Note that none of the class's code or data is pickled, so in the following example the class attribute attr is not restored in the unpickling environment:

class Foo:
attr = 'a class attr'

picklestring = pickle.dumps(Foo)

These restrictions are why picklable functions and classes must be defined in the top level of a module.

Similarly, when class instances are pickled, their class's code and data are not pickled along with them. Only the instance data are pickled. This is done on purpose, so you can fix bugs in a class or add methods to the class and still load objects that were created with an earlier version of the class. If you plan to have long-lived objects that will see many versions of a class, it may be worthwhile to put a version number in the objects so that suitable conversions can be made by the class's __setstate__() method.
Особой нужды паковать классы я не вижу, но не исключаю, что такая возможность понадобится.

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

Кстати, в чем заключается эта небезопасность?
Ну, это, я думаю, нормальному программисту (и вообще логически мыслящему человеку) и так ясно — trust noone.
Что он из себя представляет? Если это образование из типов, которые я описал выше, то должен. Вообще единственное ограничение, которое я нашел в официальной документации — это функции с глубокой рекурсией.
Тема сериализации не раскрыта.

Начнем с того, что не указана цель сериализации. Иметь бинарные конфиги — моветон. Хранить состояние программы… уже лучше, но pickle в чистом виде мало пригоден. Нужно как минимум начинать с shelve (странно, что про него в статье ни слова).

По сети передавать… лучше уж тогда сериализировать в xml или (что в последнее время более популярно) json. Для json, к примеру, есть библиотеки с API не на много сложнее pickle.

Единственное, где я более менее часто встречал pickle — это хранение простых Python-структур в полях записи РСУБД. Но там в пару используют base64 и/или md5/sha1. Про это тоже ни полслова в статье…
Хочешь — напиши лучше. Я описал базовое применение пикла.
Да, иногда модули, написанные на С, работают быстрее их питоновских аналогов, но тут есть тонкости, в которые в этой статье я позволю себе не углубляться.


Иногда? O_o
Эх, не удалось ускользнуть от этой холиварной темы… :)

Показательно, что питоновские модули, написанные на С, можно пересчитать по пальцам.
Нет, я просто удивился. Неужто так быстро все выполняется?
Если ты про cPickle, то да. Действительно огромный прирост скорости. Ничего не попишешь, С — язык низкого уровня, а Питон — высокого. За удобство приходится платить.
Нет, я не об этом. Иногда Питон выполняется быстрее C?
Если Питоновская программа написана прямыми руками, а которая на С — кривыми, то да :)
Пример. Игра EVE-Online написана на чистом Питоне (клиент и сервер), и ничего.
точнее, stackless python
и клиент, например, не совсем на чистом. графический движок не на питоне, но предоставляет api для питона
Что-то мне казалось, что сервер Ив написан на яве, а в клиенте питон используется только в отдельных местах и для скриптования. Опровергнете?
Извините, я уже просветился. Вы правы.

Черт, не зря я, наверное, питонщик, который любит только одну мморпг — именно эту (: все взяимосвязано, хе-хе.
У меня ж есть эти исходники, я просто так говорить не стану :)
Ух ты! А откуда, если не секрет?
Наверное, если я скажу, сразу же приедут люди и съедят мою собаку… ОК, Бухта.
дык она откомпилирована, небось, в таком случае разницы особой и нет, на каком языке написано
Но Питон-то они взяли не с потолка, не из-за прихоти.
может быть, они фанаты Пайтона?
думаю, на нём разрабатывать быстрее, чем на С
а против утечек памяти и т.п. они раз в сутки перезагружают сервер :)
нет. у них уникальность в том что любой объект в игре (например выпущеная ракета) — это отдельный микро-поток.

почитайте про stackless. очень интересный подход.
OMFG, подумал я… Мой первый псто — и на глагнег!..
А на что похожи получившиеся «консервы»?
Их можно править в текстовом редакторе?
Или хотя бы просматривать?
ну если приловчиться, то можно просматривать. но совсем не рекомендую.
использовали cPickle в продакшене, для хранения данных готовых к отправке на сервер статистики. Данные были исключительно list и dict, были моменты когда этот pickle съезжал нафиг, вообщем отказались.
Если второй протокол, то ничего просмотреть особо не получится.
То, о чем вы написали называется «сериализацией». А «консервируют» продукты на зиму.
Действительно слабовато, описали два метода dump и load, а все тонкости проигнорировали.
Sign up to leave a comment.

Articles