當我嘗試在用作分析操作的嵌套函數中嘗試使用" ".join(...)
時,我遇到了PyParsing的非常奇怪的行爲。例如,這樣的:爲什麼解析操作中的str.join會產生異常?
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))
一切工作正常。我很難過。爲什麼PyParsing 調用的內容的nested_func
呢?
我使用的Python 3.3.3和PyParsing 2.0.1附帶的WinPython。
爲什麼你命名函數'lambda_func'?這不是很具描述性,特別是因爲這些功能都不是lambda表達式。 – user2357112
'函數()'和'alsoworks()'有一點不同,你不是用'Group()'包裝'OneOrMoreWord()'。如果用'Group()'包裝'OneOrMoreWord()',你會在這兩個函數中得到同樣的錯誤嗎? –
當我看到Group(OneOrMore(Word(alphas)))的輸出時,它會出來(['['boom','baba','boom'],{})],{})' 。當我將該結構傳遞給'「」.join()'我得到一個異常,因爲第一個序列項是一個列表。數據結構是你真正想要的嗎? –