Целесообразно ли сохранять данные в виде модулей Python? - PullRequest
3 голосов
/ 03 октября 2009

Это то, что я сделал для проекта. У меня есть несколько структур данных, которые являются основными словарями с некоторыми методами, которые работают с данными. Когда я сохраняю их на диск, я записываю их в файлы .py в виде кода, который при импорте в виде модуля загружает те же данные в такую ​​структуру данных.

Это разумно? Есть ли большие недостатки? Я вижу преимущество в том, что когда я хочу работать с сохраненными данными, я могу быстро импортировать нужные мне модули. Кроме того, модули можно использовать отдельно от остальной части приложения, поскольку вам не нужны отдельные функции синтаксического анализатора или загрузчика.

Ответы [ 5 ]

7 голосов
/ 03 октября 2009

Действуя таким образом, вы можете получить некоторое удобство, но вы платите за это много разных цен. Пространство, необходимое для сохранения ваших данных, и время, необходимое для их сохранения и перезагрузки, существенно увеличиваются; и ваша уязвимость не ограничена - вы должны жестоко защищать пути, с которых вы перезагружаете модули, поскольку это позволит любому злоумышленнику легко внедрить код по своему выбору для выполнения под вашим идентификатором пользователя (pickle само по себе не рок - твердый, с точки зрения безопасности, но по сравнению с этим устройством он сияет; -).

В целом, я предпочитаю более простое и более традиционное расположение: исполняемый код находится в одном модуле (по типичному пути загрузки кода, который не должен быть R / W после компиляции модуля) - он загружается только один раз и из уже скомпилированной формы. Данные хранятся в своих собственных файлах (или частях БД и т. Д.) В любом из множества подходящих форматов, в основном стандартных (возможно, включая многоязычные, такие как JSON, CSV, XML, ... и т. Д., Если я хочу сохранить опция открыта для простой загрузки этих данных с других языков в будущем).

3 голосов
/ 04 октября 2009

Ответ Алекса Мартелли абсолютно проницательный, и я согласен с ним. Однако я сделаю еще один шаг и дам конкретную рекомендацию: используйте JSON.

JSON прост, и структуры данных Python хорошо вписываются в него; и есть несколько стандартных библиотек и инструментов для работы с JSON. Модуль json в Python 3.0 и новее основан на simplejson , поэтому я бы использовал simplejson в Python 2.x и json в Python 3.0 и новее.

Второй выбор - XML. XML более сложный, и его сложнее просто посмотреть (или просто отредактировать с помощью текстового редактора), но существует множество инструментов для его проверки, фильтрации, редактирования и т. Д.

Кроме того, если ваши потребности в хранении и извлечении данных становятся нетривиальными, рассмотрите возможность использования реальной базы данных. SQLite потрясающий: он маленький, и для небольших баз данных работает очень быстро, но это реальная база данных SQL. Я определенно использовал бы Python ORM вместо изучения SQL для взаимодействия с базой данных; мой любимый ORM для SQLite будет Autumn (маленький и простой) или ORM из Django (вам даже не нужно учиться создавать таблицы в SQL!) Тогда если Вы когда-либо перерастаете SQLite, вы можете перейти к реальной базе данных, такой как PostgreSQL . Если вы обнаружите, что пишете множество циклов, которые выполняют поиск в ваших сохраненных данных, и особенно если вам нужно навязать зависимости (например, если foo удален, bar тоже должен быть удален), подумайте о переходе в базу данных.

3 голосов
/ 03 октября 2009

Разумным вариантом может быть использование модуля Pickle , который специально разработан для сохранения и восстановления структур python на диск.

3 голосов
/ 03 октября 2009

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

Но, например, когда я выполняю миграцию веб-сайтов на Plone, я часто получаю данные о сайте (например, список страниц, которые нужно перенести, или список того, какие старые URL должны быть сопоставлены с новыми, или списки тегов). Это вы обычно получаете в формате Word и Excel. Кроме того, данные часто нужно немного помассировать, и я в конечном итоге получаю словари, отображающие один URL-адрес для какой-то другой информации.

Конечно, я мог бы сохранить это как CVS и разобрать его в словарь. Но вместо этого я обычно сохраняю его как файл Python со словарем. Сохраняет код.

Так что, да, это разумно, нет, это не тот формат, который вы должны использовать для любого файла сохранения. Однако он часто используется для данных, которые пересекают границу конфигурации, как указано выше.

3 голосов
/ 03 октября 2009

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

...