Проблема Pyparsing SetParseAction - PullRequest
       5

Проблема Pyparsing SetParseAction

1 голос
/ 10 февраля 2012

Я новичок в pyparsing. Я пытаюсь поэкспериментировать с setParseAction, но иногда его не вызывают.Вот код

def fun():
    comdty_tok = StringStart() + Word(alphas) + StringEnd()
    comdty_tok.setParseAction(call_back)
    comdty_tok.leaveWhitespace()
    return comdty_tok

def call_back(p):
    print 'Calling ....'
    print p

class ComdtyTok(Token):

     comdty_tok = StringStart() + Word(alphas) + StringEnd()
     comdty_tok.setParseAction(call_back)
     comdty_tok.leaveWhitespace()
     parseImpl = comdty_tok.parseImpl

class SymParser(object):
    tok =  ComdtyTok()
    @staticmethod
    def parse(symbol):
       p = SymParser.tok.parseString(symbol)
       print p
       print "Second"
       x = fun()
       x.parseString(symbol)
       return p

SymParser.parse('ABCD')

Я не понимаю, почему setParseAction не вызывается в первый раз.

Ответы [ 2 ]

2 голосов
/ 10 февраля 2012

Я только что поиграл с pyparsing в первый раз, поэтому ...

При инициализации переменной класса comdty_tok вы на самом деле никогда не вызываете parseString(), поэтому обратный вызов, связанный с объектом разбора, никогда не вызывается.

1 голос
/ 11 февраля 2012

Все, что я могу сказать, это то, что я не собирался расширять классы, подобные Token, так, как вы это делали. Я подозреваю, что в вашем делегировании содержавшемуся атрибуту cmdty_tok, который вы пропустили, был выставлен какой-то другой атрибут, такой как parseAction, на который обычно ссылаются при разборе parseImpl. С другой стороны, ваша реализация fun() очень согласуется с другими помощниками и замыканиями, которые я использовал и видел использованными, и неудивительно, что этот подход работает.

Чего вы пытаетесь достичь с ComdtyTok?

...