2016-12-16 15 views
1

pyparsing のインスタンス化フラグに応じて若干異なるものと思われる 複合マッチャーオブジェクトを構成します。ここでは(簡体字)例:クラス変数要素からインスタンス変数pyparsing matcherを構築する

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) 

abc、....私はちょうどそのよう彼らにexprで を参照することができ、それらを接頭辞する必要がないように、クラス変数です インスタンス参照selfself.aなど)。 exprは という異なるインスタンシエーションが異なるものに一致する必要があるため、 インスタンスである必要があります。

上記の例では動作します:予想通り

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

リターン:

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

私の心配がある:なくてもたくさんの と非常に複雑なマッチャのためにこの仕事(ネスト)abc,dなど...?または異なった言い方:abc は、次のMyMatcherオブジェクトに上書きさという問題ではありませんようには、インスタンスに オブジェクトexprをクラス変数からをコピー(ディープ)フルロジック です創造?

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

答えて

2

変数abc、... ないクラス変数です。それらは__init__メソッドのローカル変数です。これらの変数への参照は、必要な限り長く維持されます。 (PythonのマニュアルScopes and Namespaces in Classesを参照してください)

関連する問題