【问题标题】:Pyparsing SetParseAction troublePyparsing SetParseAction 麻烦
【发布时间】:2012-02-11 05:06:33
【问题描述】:

我是 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。

【问题讨论】:

    标签: python parsing pyparsing


    【解决方案1】:

    我只是第一次玩 pyparsing,所以...

    在初始化类变量comdty_tok 时,您从未真正调用parseString(),因此与解析对象关联的回调永远不会被调用。

    【讨论】:

    • 我不认为是这样 - 解析中的第一条语句是 p = SymParser.tok.parseString(symbol)
    • @PaulMcGuire:你是对的。我刚刚在这只小狗的内脏中花了大约 1/2 小时,坦率地说,我很困惑。在两个令牌实例上设置setDebug() 只会增加谜团。第一次调用根本没有显示调试输出,而第二次则按预期运行。如果你用 `= fun()` 来初始化 SymParser.tok,一切都是甜蜜而轻松的。
    【解决方案2】:

    我只能说,我并没有真正打算以您所做的方式扩展像 Token 这样的类。我怀疑在您对包含的cmdty_tok 属性的委托中,您省略了暴露一些其他属性,例如parseAction,通常在解析时由parseImpl 引用。另一方面,您对fun() 的实现与我使用过和看到使用过的其他助手和闭包非常一致,并且毫不奇怪,这种方法有效。

    你想用ComdtyTok完成什么?

    【讨论】:

    • 基本上我想抽象一个类中的所有正则表达式,我读到这个我们可以通过继承 Token 类来做到这一点,但我不确定控制是如何流动的。
    猜你喜欢
    • 1970-01-01
    • 2011-02-25
    • 2010-11-11
    • 2011-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多