从类变量元素构造实例变量pyparsing matcher

时间:2016-12-16 01:13:58

标签: python oop deep-copy pyprocessing

使用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)

abc,....是 class 变量,以便我可以引用它们 在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']

我担心的是:这是否适用于非常复杂的有很多匹配的匹配器 (嵌套)abcd等等?或者措辞不同:是 从类变量到实例的完整逻辑(深度)复制 对象expr,因此abc无关紧要 在下一个MyMatcher对象创建时被覆盖?

或者,如果这是一个问题,是否有另一种方法来创建变化 像(a + b | b ) + pp.Optional(c)这样的短而美丽的构造的匹配器?

1 个答案:

答案 0 :(得分:2)

变量abc,....是类变量;它们是__init__方法中的局部变量。只要需要,对这些变量的引用将保持活动状态。 (参见Python文档Scopes and Namespaces in Classes。)