我构造了一个复杂的匹配器对象,该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
(如 in 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
?或者换一种说法:是否将完整的逻辑(深度)从类变量复制到实例对象expr
,以便
在下一次创建对象时覆盖a
,b
和被覆盖?c
MyMatcher
或者,如果这是一个问题,是否有另一种方法来创建具有短而漂亮的结构的不同匹配器,例如(a + b | b ) +
pp.Optional(c)
?