2

对于我的一个项目,我有一个围绕 python cmd类构建的 python 程序。这使我能够围绕发送到数据库的 sql 语句制作一种迷你语言。除了使与 python 的连接变得更容易之外,我还可以做 sql 不能做的事情。这对几个项目非常重要。但是,我现在需要添加 if 块以获得更大的控制流。

我目前的想法是,我将只在语言中添加两个新命令,即 IF 和 END。这些设置了一个变量,该变量确定是否跳过一行。我想知道是否有其他人使用 cmd 模块完成了此操作,如果是,是否有我缺少的标准方法?谷歌似乎没有透露任何内容,cmd 文档也没有透露任何内容。

对于与我正在做的类似的想法,请转到此处。欢迎提问和评论。:)

嗯,比我想的要复杂一点,虽然有 python 语法会很好。在我最终完成之前,我争论了很长时间来构建一种迷你语言。问题主要来自外部限制。我有一堆“数据”,很慷慨,要变成sql。这是基于其他不会通过的“数据”。它对于问题的每个特定“版本”也是唯一的。对 sql 做直接数据本来是我的第一个倾向,但不切实际。

对于好奇的人,我花了很多时间来阅读 unix 编程艺术中的迷你语言章节,在这里可以找到。

如果我用纯 python 构建了这个东西,我就不会拥有解决问题集绝对需要的灵活性。

4

2 回答 2

1

制作“迷你语言”的局限性已经很明显了。

正确的语言具有树状结构和更复杂的语法,cmd难以处理。

有时,直接使用 Python 实际上比发明自己的 DSL 更容易。

目前,您的 DSL 可能会读取类似脚本的命令文件。

由于这种方式cmd有效,您的小注释会得到一个字符串参数,必须对其进行解析。然后命令被执行。此外,每个命令都是cmd.Cmd子类的一个方法。

这是你可以做的。

每个do_foo( self, args )方法都成为一个独立的可调用对象。它将遵循命令设计模式。它将完全按照方法函数现在所做的。不少于。 完全一样。

class Foo( object ):
    def __init__( self, global_context ):
        self.context= global_context
    def __call__( self, args ):
        ... The rest of do_foo ... 

此外,您现有的cmd.Cmd子类可能会维护一些内部状态。所有的self.thisself.that实例变量都必须更改为引用和显式上下文对象。

class Context( object ): pass

更改self.thisself.that改为self.context.thisself.context.that

现在,您可以创建上下文和各种命令。

ctx = Context()
foo= Foo(ctx)

您的脚本稍微改变了语法。从:

foo argstring
bar argstring

到:

from mylanguage import foo, bar
foo( "argstring" )
bar( "argstring" )

正是CLI 现在所做的。不再。不少于。 完全一样。语法略有不同。

现在您的脚本不再是难以扩展的 DSL。它在 Python 中。

完成后,您现在可以使用 Python 语法if语句。

您拥有当前以更好的语法实现的Exact功能。cmd

于 2011-05-26T18:31:12.770 回答
-1

在检查了更多的问题集之后,我得出的结论是我可以不理会迷你语言。它具有我需要的所有功能,而且我没有时间从头开始重建项目。这是一个有趣的问题,如果我遇到同样的情况,我不再确定我会构建另一种迷你语言。OTOH,它在这里工作得很好,我不愿意放弃它所赋予的优势。

于 2011-06-20T12:41:52.980 回答