2010-09-12 2 views
2

Я ищу подходящую структуру данных в Python для обработки переменно структурированных форм. Переменно структурированными формами я подразумеваю, что количество полей формы и типы содержимого формы не известны заранее. Они определяются пользователем, который заполняет формы своим вводом.Python: Должен ли я помещать свои данные в списки или атрибуты объекта?

Каковы плюсы и минусы размещения данных в A) объектных атрибутах (например, в противном случае пустой «form» -класс) или B) просто перечисляет/dicts? Учтите, что мне нужно сохранить последовательность полей формы, имена полей формы и типы.

(Как ни странно, было трудно найти исчерпывающую информацию по этой теме. Поскольку я еще новичок в Python, возможно, что я искал неправильные условия. Если мой вопрос недостаточно ясен, обратитесь в комментарии, и я попытаюсь уточнить.)

+0

Реагируя на первые ответы: моим первоначальным подходом также было использование списков и dicts, поскольку это кажется интуитивным в Python. Затем я наткнулся на часть официального учебника Python, в котором описывается «тип данных, похожий на запись Pascal» или «C», объединяющий несколько названных элементов данных ». (http://docs.python.org/tutorial/classes.html#odds-and-ends) – lecodesportif

+0

@lecodesportif: Я видел, что шаблон класса «содержит некоторые элементы» используется, главным образом, при передаче данных в существующий код, который использует точку (т.е. 'foo.bar' вместо' foo ['bar'] ') или людей с недовольством синтаксисом словаря. Не уверен в обосновании использования в новом коде. – cdleary

+0

@cdleary: Как он сравнивает производительность? Это может быть оправдание? – lecodesportif

ответ

4

классы Python буквально только два dicts (один для функций, один для данных), имя и правила, как Python выглядит для ключей. Когда вы получаете доступ к существующим ключам, нет абсолютно никакой разницы с dict (если вы не перезаписываете правила доступа).

Это означает, что нет никакого недостатка (кроме кода больше) для использования классов вообще, и вы никогда не должны быть боятся написать класс.

В вашем конкретном случае, я думаю, вы должны пойти с классами по одной простой причине: возможно, вы захотите продлить их позже. Возможно, вы хотите добавить ограничения на имя (длина, допустимые буквы, уникальность, ...) или значение (не пустое, длина, тип, ...) поля в один день. Возможно, вы хотите проверить все поля в форме. Если вы используете класс, вы можете сделать это без изменения каких-либо кода за пределами класса! И, как я уже говорил, даже если вы этого не сделаете, нет недостатков!

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

+0

+1 от меня. Мне очень понравился этот ответ. – duffymo

+0

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

+0

Это был лучший ответ. – lecodesportif

0

Это не очень Pythonic для случайного добавления членов в объект. Было бы более Pythonic, если бы вы использовали методы-члены, чтобы сделать это, но все-таки не так, как обычно делаются.

Каждая библиотека, которую я видел для такого рода вещей, использует словари или списки. Итак, это идиоматически Python способ справиться с этой проблемой. Иногда они используют объект, который переопределяет __getitem__, поэтому он может вести себя как словарь или список, но он по-прежнему является синтаксисом словаря, который используется для доступа к полям.

Я думаю, что все плюсы и минусы имеют отношение к людям, понимающим ваш код, и поскольку я никогда не видел кода, который обрабатывает это, имея объект с членами, которые могут появиться, я не думаю, что многие люди найдут код что делает это очень понятным.

5

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

+2

Именованные вершины попадают в одну категорию: http://docs.python.org/library/collections.html?highlight=namedtuple#collections.namedtuple И они предоставляют именованные поля. – delnan

+0

+1 для этого краткого объяснения – lecodesportif

0

Список словарей (например, [{"type": "text", "name": "field_name", "value": "test value"}, ...]) будет полезной структурой, если Я правильно понимаю ваше требование.

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

0

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

, то вы можете получить доступ к нему, как

полей [2 ] .name поля [2] .value

ЭСТ

Смежные вопросы