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

2024-10-02 10:18:56 发布

您现在位置:Python中文网/ 问答频道 /正文

^{}I构造一个 假设匹配稍有不同的复杂匹配器对象 这取决于实例化标志。这里有一个(简化的)示例:

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,。。。。是变量,以便我可以引用它们 在expr中,就像那样,不必在它们前面加上 实例引用self(类似于self.aexpr必须是一个 实例变量,因为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等?或者用不同的措辞:是 完整逻辑(deep-)将从类变量复制到实例 对象expr,这样abc就不重要了 在下一个MyMatcher对象创建时被覆盖?

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


Tags: 对象实例selfalphafalse示例parsedef

热门问题