1

我构造了一个复杂的匹配器对象,该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']

我担心的是:即使对于具有大量(嵌套)、、、、等的非常复杂的匹配器,这是否ab有效c... d?或者换一种说法:是否将完整的逻辑(深度)从类变量复制到实例对象expr,以便 在下一次创建对象时覆盖a,b和被覆盖?cMyMatcher

或者,如果这是一个问题,是否有另一种方法来创建具有短而漂亮的结构的不同匹配器,例如(a + b | b ) + pp.Optional(c)

4

1 回答 1

2

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

于 2016-12-20T03:24:23.237 回答