簡體   English   中英

從類變量元素構造實例變量pyparsing匹配器

[英]Constructing a instance variable pyparsing matcher from class variable elements

通過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加上前綴(例如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 復制了完整的邏輯(深層) ,因此在下一個MyMatcher對象創建時abc被覆蓋MyMatcher嗎?

或者,如果這是一個問題,是否還有另一種方法可以用短而美觀的結構來創建各種匹配器,例如(a + b | b ) + pp.Optional(c)

變量abc ,... 不是類變量。 它們是__init__方法中的局部變量。 只要需要,對這些變量的引用將保持有效。 (請參見Python文檔中的范圍和類中的命名空間 。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM