2

私のプロジェクトの 1 つで、python cmdクラスを中心に構築された python プログラムがあります。これにより、データベースに送信する sql ステートメントに関するミニ言語を作成することができました。Python との接続がはるかに簡単になるだけでなく、SQL ではできないことを実行できます。これは、いくつかのプロジェクトにとって非常に重要でした。ただし、制御フローを大きくするために if ブロックを追加する必要があります。

私の現在の考えでは、IF と END という 2 つの新しいコマンドを言語に追加するだけです。これらは、行をスキップするかどうかを決定する変数を設定します。他の誰かが cmd モジュールでこれを行ったかどうかを知りたいのですが、もしそうなら、私が見逃している標準的な方法はありますか? Google は何も明らかにしていないようで、cmd ドキュメントも何も明らかにしていません。

私がやっていることと同様のアイデアについては、ここにアクセスしてください。質問とコメントを歓迎します。:)

うーん、私が考えていたよりも少し複雑ですが、Python 構文があればいいのですが。ミニ言語の構築については、最終的に実現するまでかなり長い間議論しました。この問題は、主に外部の制限から生じます。SQLに変換するための「データ」がたくさんあります。これは寛大です。これは、通過しない他の「データ」に基づいています。また、問題の特定の「バージョン」ごとに固有です。sql に対して直接データを処理することは、私の最初の傾向でしたが、実際的ではありませんでした。

好奇心旺盛な方のために、私はかなりの時間を費やして、UNIX プログラミングの芸術におけるミニ言語の章を調べました (ここにあります) 。

純粋な python で構築していたら、問題セットに絶対に必要な柔軟性がなかったでしょう。

4

2 に答える 2

1

「ミニ言語」を作成することの限界が明らかになりました。

cmd適切な言語には、ツリーのような構造と、簡単に扱えるよりも複雑な構文があります。

独自の DSL を発明するよりも、Python を直接使用する方が実際には簡単な場合があります。

現在、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.thisインスタンス変数とインスタンス変数はすべて、self.that明示的なコンテキスト オブジェクトを参照するように変更する必要があります。

class Context( object ): pass

self.thisまたはself.thatself.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 ではなくなりました。それはパイソンにあります。

ifこれで、Python 構文ステートメントを使用できるようになりました。

現在、より優れた構文でExact機能が実装されています。cmd

于 2011-05-26T18:31:12.770 に答える
-1

After examining the problem set some more, I've come to the conclusion that I can leave the minilanguage alone. It has all the features I need, and I don't have the time to rebuild the project from the ground up. This has been an interesting problem and I'm no longer sure I would build another minilanguage if I encountered the same situation. OTOH, it works very well here, and I am loathe to give up the advantages it has conferred.

于 2011-06-20T12:41:52.980 に答える