Построение совпадения 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 Области и пространства имен в классах.)