当我尝试在用作解析操作的嵌套函数内使用 "".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/