Python cmd解释器添加了if语句

问题描述

| 对于我的一个项目,我有一个围绕python cmd类构建的python程序。这使我能够围绕发送到数据库sql语句编写一种迷你语言。除了可以更轻松地与python连接之外,我还可以执行sql无法做到的事情。这对于几个项目非常重要。但是,我现在需要添加if块以获得更大的控制流。 我目前的想法是,我只会在语言中添加两个新命令IF和END。它们设置了一个变量,该变量确定是否跳过一行。我想知道是否有人使用cmd模块完成了此操作,如果是,我是否缺少标准方法? Google似乎没有透露任何内容,cmd文档也没有透露任何内容。 要获得与我正在执行的操作类似的想法,请转到此处。欢迎提出问题和意见。 :) 嗯,比我想的要复杂一点,尽管拥有Python语法会很好。在我最终决定建立一种迷你语言之前,我曾争论过一段时间。问题主要来自外部限制。我有一堆慷慨的\“ data \”可以转换为sql。这基于不会通过的其他“数据”。它对于问题的每个特定“版本”也是唯一的。对sql直接进行数据处理是我的初衷,但不切实际。 出于好奇,我花了很多时间浏览unix编程领域的迷你语言一章。 如果我是用纯python构建的东西,我将不会有我绝对需要的灵活性来解决问题。     

解决方法

制作“迷你语言”的局限性显而易见。 适当的语言具有树状结构,语法比ѭ0可以轻松处理。 有时候,直接使用Python比发明自己的DSL更容易。 当前,您的DSL可能会读取类似脚本的命令文件。 由于
cmd
的工作方式,您的小注释会得到一个字符串参数,必须对其进行解析。然后命令被执行。而且,每个命令都是“ 2”子类的方法。 这是您可以做的。 每个“ 3”方法都成为一个独立的可调用对象。它将遵循命令设计模式。它将完全执行方法功能现在所做的事情。不少一模一样。
class Foo( object ):
    def __init__( self,global_context ):
        self.context= global_context
    def __call__( self,args ):
        ... The rest of do_foo ... 
此外,您现有的“ 2”子类可能维护一些内部状态。 所有
self.this
self.that
实例变量都必须更改为引用 和显式上下文对象。
class Context( object ): pass
self.this
self.that
更改为
self.context.this
self.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
语句。 您目前已使用更好的语法在ѭ0中实现了Exact功能。     ,在研究了更多问题集之后,我得出的结论是,我可以不理会迷你语言。它具有我需要的所有功能,而且我没有时间从头开始重建项目。这是一个有趣的问题,如果遇到相同的情况,我不再确定是否会构建另一种迷你语言。 OTOH,它在这里很好用,我不愿放弃它所赋予的优势。