gpt4 book ai didi

python - 编写领域特定语言以从表中选择行

转载 作者:太空狗 更新时间:2023-10-30 01:04:08 27 4
gpt4 key购买 nike

我正在编写一个服务器,我希望它由许多不同的人运行,而不是所有我都会直接联系的人。服务器将在集群中相互通信。服务器的部分功能涉及从可能非常大的表中选择一小部分行。选择哪些行的确切选择将需要一些调整,重要的是运行集群的人(例如我自己)可以更新选择标准,而无需让每个服务器管理员部署新版本的服务器.

简单地用 Python 编写函数并不是一个真正的选择,因为没有人会想要安装一个在运行时下载和执行任意 Python 代码的服务器。

我需要的是关于实现领域特定语言以实现此目标的最简单方法的建议。该语言需要能够进行简单的表达式评估,以及查询表索引和遍历返回的行。编写和阅读该语言的难易程度仅次于实现它的难易程度。我也不想编写整个查询优化器,因此明确指定要查询哪些索引的东西是理想的。

这必须针对其进行编译的接口(interface)在功能上类似于 App Engine 数据存储区导出的接口(interface):您可以查询表上任何索引的顺序范围(例如,小于、大于、范围和相等查询),然后通过任何 bool 表达式过滤返回的行。您还可以将多个独立的结果集连接在一起。

我意识到这个问题听起来很像我在问 SQL。但是,我不想要求支持此数据的数据存储是关系数据库,而且我不想自己尝试重新实现 SQL 的开销。我也只处理一个具有已知模式的表。最后,不需要连接。更简单的东西会更好。

编辑:扩展描述以消除一些误解。

最佳答案

构建由 Python 解释的 DSL。

第 1 步。构建运行时类和对象。这些类将所有游标循环和 SQL 语句以及所有算法处理隐藏在它们的方法中。您将大量使用 CommandStrategy设计模式来构建这些类。大多数东西都是命令,选项和选择是插件策略。查看 Apache Ant 的设计 Task API——这是一个很好的例子。

第 2 步。验证此对象系统是否确实有效。确保设计简单完整。您的测试将构建 Command 和 Strategy 对象,然后执行顶级 Command 对象。命令对象将完成这项工作。

至此,您已大功告成。您的运行时只是从上述域创建的对象的配置。 [这并不像听起来那么容易。定义一组可以实例化的类,然后“相互交谈”以完成应用程序的工作需要一些注意。]

请注意,您将拥有的只是声明。程序有什么问题?当你开始编写带有过程元素的 DSL 时,你会发现你需要越来越多的特性,直到你用不同的语法编写了 Python。不好。

此外,程序语言解释器很难编写。执行状态和引用范围很难管理。

您可以使用 native Python,而不必担心“脱离沙箱”。实际上,这就是您对所有内容进行单元测试的方式,使用一个简短的 Python 脚本来创建您的对象。 Python 将成为 DSL。

[“但是等等”,你说,“如果我简单地使用 Python 作为 DSL,人们可以执行任意的事情。”取决于 PYTHONPATH 和 sys.path 上的内容。看site用于控制可用内容的方法的模块。]

声明式 DSL 是最简单的。这完全是一种代表性练习。仅设置一些变量值的 Python 代码块非常好。这就是 Django 使用的。

您可以使用 ConfigParser作为表示对象的运行时配置的语言。

您可以使用 JSONYAML作为表示对象的运行时配置的语言。现成的解析器是完全可用的。

您也可以使用 XML。它更难设计和解析,但效果很好。人们喜欢它。这就是 Ant 和 Maven(以及许多其他工具)使用声明性语法来描述过程的方式。我不推荐它,因为它是脖子上的罗嗦。我建议只使用 Python。

或者,您可以深入研究并发明自己的语法并编写自己的解析器。

关于python - 编写领域特定语言以从表中选择行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/140026/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com