Построение совпадения pyparsing переменной экземпляра из элементов переменной класса

С 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 (как в 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']

Мое беспокойство: это работает даже для очень сложных сопоставителей с большим количеством (вложенных) a, b, c, d, так далее...? Или по-другому: копируется ли полная логика (глубокая) из переменных класса в объект экземпляра expr так что не имеет значения, что a , b а также c переписать на следующий MyMatcher создание объекта?

Или, если это проблема, есть ли другой способ создать различные соответствия с короткой и красивой конструкцией, такой как (a + b | b ) + pp.Optional(c)?

1 ответ

Решение

Переменные a, b, c.... не являются переменными класса; они являются локальными переменными в __init__ метод. Ссылки на эти переменные будут поддерживаться столько, сколько потребуется. (См. В документации по Python Области и пространства имен в классах.)

Другие вопросы по тегам