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,....是类变量,因此我可以引用它们
就像在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)

最佳答案

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

10-07 12:42
查看更多