2

以下のマトリックスデータを参照してください。

    A   B   C   D   E   F   G
1   89  92  18  7   90  35  60
2   62  60  90  91  38  30  50
3   59  91  98  81  67  88  70
4   20  28  31  9   91  6   18
5   80  27  66  1   33  91  18
6   82  30  47  8   39  22  32
7   14  11  70  39  18  10  56
8   98  95  84  47  28  62  99

「ルール」関数を定義する必要があります。以下の場合、各行データの文字列をアサートするために「true」または「false」を返すことができます。

A=B and B=C
A>C
B>C
C>D and D<E or D>F
A+B<30
A+B<=30                # this may using "A+B<30 or A+B=30" as alternative
str(A) march regex"[2-5][0-2]" 
myfoo(A) > 100 
A in myfoo(B)
A not_in $listname
A in $listname

たとえば、「A = B and B = C」を考えてみましょう。このルールに行1を渡すと、この場合は正しくないため、ルールがfalseを返すようにします。

私の質問は次のとおりです。

  1. これらの「ルール文字列」を実行可能なラムダ関数に変換するDSLパーサーを定義するにはどうすればよいですか。次に、データ行をパラメーターとしてこのラムダを呼び出して、アサート結果を返すことができますか?

  2. モジュール操作には、ルールを定義するために再利用できる多くの数学関数があることに気付きました。DSLパーサーで使用するためにそれらのキーワードの「マッパー」を作成できますか?次のようになります。

    キーワード={"+":operation.add()、 "/":operation.div()、 "and":my_and_define()}

  3. 上記の2が可能な場合、ラムダとマッパーで「A in $ listname」を処理するにはどうすればよいですか?

ご協力いただきありがとうございます。

Rgs、

KC

4

2 に答える 2

1

このような。

class Rule( object ):
    def __init__( self, text ):
        self.text= text
    def test( self, A, B, C, D, E, F, G ):
        return eval( self.text )

r1= Rule( "A==B" )
r2= Rule( "A==B and B==C" )
r3= Rule( "A in {listname!s}".format( listname=someList ) )

>>> r1.test( 89,  92,  18,  7,   90,  35, 60 )
False

編集。

  • str(A)march regex "[2-5] [0-2]"
  • myfoo(A)> 100
  • Aはmyfoo(B)にあります

これらはすべて些細なPythonコードです。コメントが面白いまたは難しいものとして含まれている理由はわかりません。

r4= Rule( "re.match( r'[2-5][0-2]', str(A) )" )
r5= Rule( "myfoo(A) > 100" )
r6= Rule( "A in myfoo(B)" )

これにはトリックがあります。秘訣はPythonコードを書くことです。次に、コードを引用符で囲みます。 すべてのPythonコードは合法です。

これらのルールのPythonの側面が混乱している場合は、Pythonチュートリアルが役立つ場合があります。

于 2011-06-01T18:47:44.420 に答える
1

DSL の構文例はどの程度重要ですか? 最も簡単な方法は、Python 式の構文と eval() を使用することです。そうしないと、フォームから eval() 可能なものに変換できる可能性があります。

于 2011-06-01T18:23:03.863 に答える