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
、インスタンス参照を前に付ける必要はありません(のように)。
の異なるインスタンス化は異なるものに一致する必要があるため、
インスタンス変数でなければなりません。c
expr
self
self.a
expr
MyMatcher
上記の例は次のように機能します。
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
私の心配は次のとおりです。これは、(ネストされた) 、b
、c
、などの非常に複雑なマッチャーでも機能しd
ますか? または、別の言い方をすると、クラス変数からインスタンス objectに完全なロジックが(ディープ) コピーされているので、次のオブジェクト作成時に,
が上書きされてもexpr
かまいませんか?a
b
c
MyMatcher
または、これが問題である場合、次のような短くて美しい構造を持つさまざまなマッチャーを作成する別の方法はあり(a + b | b ) +
pp.Optional(c)
ますか?