python - 为什么解析操作中的 str.join 会产生异常?

标签 python pyparsing

当我尝试在用作解析操作的嵌套函数内使用 "".join(...) 时,PyParsing 出现非常奇怪的行为。例如,这个:

from pyparsing import *

def sigh(p):
        def nested_func(t):
           " ".join(t)
        parser = Group(OneOrMore(Word(alphas))).setParseAction(nested_func)
        return parser.parseString(p)
def works(p):
        def nested_func(t):
           print("no join!")
        parser = Group(OneOrMore(Word(alphas))).setParseAction(nested_func)
        return parser.parseString(p)
def functions(p):
        def nested_func(t):
           " ".join(t)
        parser = OneOrMore(Word(alphas)).setParseAction(nested_func)
        return parser.parseString(p)
def notnested(t):
  " ".join(t)
def alsoworks(p):
        parser = OneOrMore(Word(alphas)).setParseAction(notnested)
        return parser.parseString(p)
s = "boom baba boom"
print(sigh(s)) # comment me out
print(works(s)) 
print(functions(s))
print(alsoworks(s))

产生异常:

Traceback (most recent call last):
  File "test.py", line 24, in <module>
    print(sigh(s)) # comment me out
  File "test.py", line 7, in sigh
    return name.parseString(p)
  File "C:\...\site-packages\pyparsing.py", line 1031, in parseString
    loc, tokens = self._parse( instring, 0 )
  File "C:\...\site-packages\pyparsing.py", line 931, in _parseNoCache
    tokens = fn( instring, tokensStart, retTokens )
  File "C:\...\site-packages\pyparsing.py", line 695, in wrapper
    ret = func(*args[limit[0]:])
TypeError: nested_func() missing 1 required positional argument: 't'

但是如果我注释掉 print(sigh(s)) 一切正常。我很困惑。为什么 nested_func内容会改变 PyParsing调用的方式?

我使用的是 Python 3.3.3 和 PyParsing 2.0.1 附带的 WinPython。

最佳答案

请注意,失败的版本将解析器定义为 Group(OneOrMore(Word(alphas))) 而成功的版本将解析器定义为 OneOrMore(Word(alphas)) 。组将您的单词列表包含在另一个列表中。这就像说,“这有效:' '.join(['a','b','c']),但这失败了:' '.join([['a','b','c'] ']])”。您没有更改解析操作的调用方式,而是更改传递给它的标记的结构,将它们包含在另一级列表中。

(实际上 pyparsing 返回 ParseResults,而不仅仅是列表。ParseResults 可以像列表一样进行索引,但它们也可以具有命名结果,如字典或命名元组。这就是为什么打印出标记看起来像列表 + dict,但这只是 ParseResults 的字符串表示形式。它并不是真正的列表和字典的元组。)

关于python - 为什么解析操作中的 str.join 会产生异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22394202/

相关文章:

python - 我想要第 6 列值的总和

python - 如何在 Python3 中获取 PyObject 的字符串表示形式?

python - 使用pyparsing解析逻辑句子非常慢

python - pyparsing部分匹配或递归限制命中

python - Pyparsing 是否支持上下文相关语法?

python - 如何让 Python 生成器返回 None 而不是 StopIteration?

javascript - Python 中的 Web 套接字(使用 flask )问题

Python 二项式系数

python - 使用引用手册语法 Pyparsing Ada 2005 范围标识符时的堆栈溢出

python - 标记化规则优先级 Pyparsing