1

ユーザーがデータを入力できるようにする簡単なファイル形式/DSLを作成したいと思います。私のシステムはPythonであり、Pythonのパーサーを使用することは魅力的です。データ要素を定義するためのこのような構文は非常に便利なようです。

Allocation(Param1 = Val1, Param2 = Val2 )

ただし、スペースを含むパラメーター名はサポートされていません。

Allocation(Param 1 = Val1, Param 2 = Val2 )

Pythonパーサーに適したバージョンは次のようになりますが、あまりユーザーフレンドリーではありません。

Allocation(("Param 1",Val1), ("Param 2",Val1) )
Allocation(**{"Param 1":Val1, "Param 2":Val1} )

これをPythonで読みやすくする方法はありますか?

4

4 に答える 4

3

それをする方法があると思います。しかし、私は尋ねざるを得ないと感じています。これと読みやすさには本当に大きな違いがありますか?

Allocation(Param1 = Val1, Param2 = Val2 )

これに:

Allocation(Param 1 = Val1, Param 2 = Val2 )

その大きな違いを生むために?あなたがやりたいことをする方法があると確信していますが、私の最初の懸念は、関係する努力が結果に値するかどうかです。

私の目標は、システムへのデータ入力に使用できるDSLを提供することです。上記のシナリオでは、パラメータは人の名前になり、値はパーセンテージになります。

私はあなたが今何をしたいのかをよりよく理解していますが、それでもあなたが望むものを得るためにある程度の読みやすさを犠牲にしなければならなくなるかもしれないと思います。個人的には、次のようなものを使用します。

Allocation(
    { 'name1' : value1,
      'name1' : value2, }
)

それがうまくいかない場合は、DSLにPythonを使用するか、自家製のものを使用するかを再検討することをお勧めします。空白を許可すると、ほとんどのプログラミング言語で空白を許可するにはあいまいさが多すぎます。

それでもPythonを使用してこれを追求したい場合は、C-API SIG(SIGS)またはpython-devリスト(最後の手段として)への投稿を検討することをお勧めします。これを行うために私が見ることができる唯一の方法は、PythonインタープリターをC / C ++プログラムに埋め込み、それを使って何らかのハッキングを行うことです(これは難しい場合があります!)。

于 2008-12-09T04:42:47.137 に答える
1

あなたはこれを行うことができます:

def Allocation(**kwargs):
    print kwargs

myargs = {"Param 1":Val1, "Param 2":Val1}
Allocation(**myargs)

編集: あなたの編集には私の答えが含まれているので、いいえ、キーワード引数にスペースを入れる簡単な方法はありません。

于 2008-12-09T04:22:03.577 に答える
1

ここで基本的な前提を誤解しない限り、独自のカスタム構文を解析するクラスを作成し、そのカスタム構文を単一の引数の文字列として使用することを妨げるものは何もありません。

Allocation("Param 1=Check Up; Param 2=Mean Value Theorem;")

この例では、セミコロンは名前と値のペアの区切り文字として機能し、equalsは名前と値の区切り記号を表します。さらに、オブジェクトコンストラクターの一部としてカスタム区切り文字を受け入れるようにパーサーを簡単に構成できます。

パーサーを作成するのが難しすぎると思われる場合は、(このような構文の場合)文字列を分割するだけで値を取得できることを考慮してください。

/\s*;\s*/

その後

/\s*=\s*/

名前と値のペアをすばやく取得します。Python用にすでに作成されているいくつかの引数パーサーのいずれかから選択するオプションもあります。

確かに、これは引数パーサーとしてPythonを使用しません。これは、このようなアプローチの単純さとバランスを取る必要がある考慮事項です。

于 2008-12-09T04:40:19.780 に答える
1

これが私の好みです。

AllocationSet(
    Alloc( name="some name", value=1.23 ),
    Alloc( name="another name", value=2.34 ),
    Alloc( name="yet another name", value=4.56 ),
)

これらは、作成するのが比較的簡単なクラス宣言です。結果として得られる構造は、処理も快適です。

于 2008-12-09T16:36:00.380 に答える