2

我正在尝试用 Python 编写电路原理图绘图工具。我正在基于包含所有组件及其属性的字典创建一个简单的数据库。我还在尝试创建一种简单的查询语言,您可以在其中选择,例如,所有电阻值>100ohms 或footprint='0402'

到目前为止,我可以使用一些原始谓词搜索来选择事物,然后对更复杂的事物进行联合和交集。

但是,我无法定义纯否定搜索的语义应该是什么。例如,像

足迹!='0402'

应该选择所有足迹不等于 0402 的项目。但是只用交叉点执行此操作会给我一个空白结果。为此,我需要选择所有组件,然后与“not 0402”相交以删除我不想要的组件。

但这似乎是一种蛮力,似乎是一个可疑的解决方案。我对使用“真正的”数据库和查询语言不感兴趣,所以请不要这样做。我在这里寻找适当的工程原理,不一定是解决问题的方法。

这个问题在 SICP 书中有所涉及,但我很困惑,因为我认为他们也在使用延续和东西,我还没有得到。

有人可以解释一下消极选择东西的“正确”用法应该是什么。我在商业 cad 工具中尝试过,它按预期工作,但后来我看到了一些 SQL 查询示例(我认为),它们首先选择了一些东西,然后删除了不需要的东西。

谢谢
迈克尔

4

3 回答 3

5

有了合适的数据库,您会更开心。

你的 Python 发行版中有 SQLite。只需定义表而不是字典并使用 SQL。

如果您需要更多的功能和复杂性,您可以添加SQLAlchemy(或SQLObject),您将不会遇到这些问题。

于 2008-12-30T11:26:39.477 回答
3

这真的取决于你是如何实现这个“基于字典的简单数据库”的,为什么直接否定不起作用——你必须给我们更多的线索。

没有理由为什么直接的否定匹配不应该在 Python 中工作,例如:

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'}]

总的来说,这是一个基于字典的简单数据库——具体功能实际上取决于您的实际实现。

我拒绝建议使用真正的数据库和查询语言,因为我认为这是一个学习练习。这是一个学习练习,对吧?:)

于 2008-12-30T10:58:05.367 回答
1

我同意 S.Lott 的观点,你会更喜欢真正的数据库。SQLite 真的很轻快,使用起来几乎没有缺点。

如果您确实需要向用户公开更简单但完整的查询语言,请检查JSONPathJSONQuery(第二个是第一个的超集)。确切的语法(显然)是为 JavaScript 考虑的;但它应该给你一些想法。

此外,尝试检查与 XPath 和 XQuery 的异同。它有助于了解什么是有用的,什么是特定于文化的。

于 2008-12-30T12:18:40.573 回答