1

pyparsingインスタンス化フラグに応じて、わずかに異なるものに一致すると思われる複雑なマッチャー オブジェクトを構築します。ここに(簡略化された)例があります:

class MyMatcher():

    def __init__( self, special_flag = False):
        self.special_flag = special_flag

        a = pp.Word(pp.alphas)('A')
        if self.special_flag:
            b = pp.Word(pp.alphas)('B')
        else:
            b = pp.Word(pp.nums)('B')
        c = pp.Word(pp.alphas)('C')
        # d = ...
        # e = ...
        # ...

        self.expr = (a + b | b ) + pp.Optional(c) # + ...

    def parse(self, s):
        return self.expr.parseString(s, parseAll=True)

a、、、.... はクラス変数なので、そのように参照できb、インスタンス参照を前に付ける必要はありません(のように)。 の異なるインスタンス化は異なるものに一致する必要があるため、 インスタンス変数でなければなりません。cexprselfself.aexprMyMatcher

上記の例は次のように機能します。

mymTrue = MyMatcher(True)
mymFalse = MyMatcher(False)
print (mymTrue.parse("alpha aaaa alpha"))
print (mymFalse.parse("alpha 777 alpha"))

期待どおりに戻ります:

['alpha', 'aaaa', 'alpha']
['alpha', '777', 'alpha']

a私の心配は次のとおりです。これは、(ネストされた) 、bc、などの非常に複雑なマッチャーでも機能しdますか? または、別の言い方をすると、クラス変数からインスタンス objectに完全なロジックが(ディープ) コピーされているので、次のオブジェクト作成時に, が上書きされてもexprかまいませんか?abcMyMatcher

または、これが問題である場合、次のような短くて美しい構造を持つさまざまなマッチャーを作成する別の方法はあり(a + b | b ) + pp.Optional(c)ますか?

4

1 に答える 1

2

変数abc、.... はクラス変数ではありません。__init__これらはメソッド内のローカル変数です。これらの変数への参照は、必要な限り存続します。(Python ドキュメントのScopes and Namespaces in Classesを参照してください。)

于 2016-12-20T03:24:23.237 に答える