【发布时间】:2017-05-01 17:54:44
【问题描述】:
使用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,.... 是 class 变量,所以我可以引用它们
在expr 中,就像那样,不必在它们前面加上
实例引用self(如self.a)。 expr 必须是
instance 变量,因为 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)这样的结构又短又漂亮的匹配器?
【问题讨论】:
标签: python oop deep-copy pyprocessing