Нужна помощь в выборе элементов в простой базе данных в Python - PullRequest
2 голосов
/ 30 декабря 2008

Я пытаюсь написать инструмент для рисования схем в Python. Я создаю простую базу данных на основе словарей, которая содержит все компоненты и их свойства. Я также пытаюсь создать простой язык запросов, где вы можете выбрать, например, все резисторы со значением> 100 Ом или footprint = '0402'

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

Однако мне сложно определить, какой должна быть семантика для чисто отрицательного поиска. Например, что-то вроде

footprint! = '0402'

должен выбрать все элементы с площадью, не равной 0402. Но выполнение этого только с пересечением дает мне пустой результат. Чтобы это работало, мне нужно выбрать все компонентов, а затем пересечь «not 0402», чтобы удалить те, которые мне не нужны.

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

Эта проблема была в некоторой степени освещена в книге SICP, но я очень запутался, поскольку думаю, что они также использовали продолжения и прочее, чего я пока не понимаю.

Может кто-нибудь объяснить, каким должно быть «правильное» использование для отрицательного выбора материала. Я попробовал это в коммерческом инструменте cad, и он работал как ожидалось, но затем я увидел несколько примеров SQL-запросов (я думаю), которые выбирали вещи сначала , а затем удаляли ненужные.

спасибо
майкл

Ответы [ 3 ]

5 голосов
/ 30 декабря 2008

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

У вас есть SQLite с вашим дистрибутивом Python. Просто определите таблицы вместо словарей и используйте SQL.

Если вам нужно больше силы и сложности, вы можете добавить SQLAlchemy (или SQLObject ), и вы не будете бороться с этими проблемами.

3 голосов
/ 30 декабря 2008

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

Нет причины, по которой прямое совпадение отрицания не должно работать в Python, например ::10000*

components = [
    { 'name': 'resistor', 'footprint': '0402', },
    { 'name': 'LED', 'footprint': '0100', },
    { 'name': 'speaker', 'footprint': '2000', },
]

[comp for comp in components if comp['footprint'] != '0402']
# [{'footprint': '0100', 'name': 'LED'}, {'footprint': '2000', 'name': 'speaker'}]

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

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

1 голос
/ 30 декабря 2008

Я согласен с С.Лоттом, что вы были бы счастливее с настоящей БД. SQLite действительно легкий и быстрый, у него практически нет недостатков в использовании.

, если вам действительно нужно предоставить пользователю более простой, но полный язык запросов, отметьте JSONPath или JSONQuery (второй является расширенным для первого). Точный синтаксис (очевидно) продуман для JavaScript; но это должно дать вам некоторые идеи.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...