質問

ユーザーがデータを入力できるようにする単純なファイル形式/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で読みやすくする方法はありますか?

役に立ちましたか?

解決

ここに私の好みです。

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

これらは、作成する比較的簡単なクラス宣言です。得られた構造があまりにも、プロセスに楽しいです。

他のヒント

何か方法があるのではないかと想像します。しかし、本当にこれと読みやすさに十分な大きな違いがあるのだろうか、と尋ねざるを得ません。

Allocation(Param1 = Val1, Param2 = Val2 )

これに対して:

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

そこまで大きな違いを生むには?やりたいことを実現する方法はあると思いますが、私が最初に心配しているのは、その労力に見合った結果が得られるかどうかです。

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

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

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

それが受け入れられない場合は、DSL に Python を使用するか、それとも独自開発のものを使用するかを再考した方がよいでしょう。空白を許可すると、ほとんどのプログラミング言語ではあいまいさが多くなりすぎて許可されなくなります。

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

私はここにあなたの基本的な前提を間違えていない限り、独自のカスタム構文を解析するクラスを書いて、その後、単一引数の文字列としてそのカスタム構文を使用してからあなたを停止するには何もありません。

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

この例では、セミコロンは、名前と値のペアセパレータとして作用し、名前と値のセパレータを表し等しいです。また、あなたが簡単にオブジェクトコンストラクタの一部として、カスタム区切り文字を受け入れるようにあなたのパーサを設定することができます。

それはパーサを書くには余りにも困難なようであれば、

、(このような構文のために)あなたは、単に

上の文字列を分割することにより、自分の価値観を得ることができることを考えます
/\s*;\s*/

、その後の

/\s*=\s*/

すぐに名前と値のペアを取得します。また、すでにPythonのために書かれたいくつかの引数パーサのいずれかから選択するオプションを持っています。

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

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

def Allocation(**kwargs):
    print kwargs

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top