2014-03-14 46 views
1

當我嘗試在用作分析操作的嵌套函數中嘗試使用" ".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。

+1

爲什麼你命名函數'lambda_func'?這不是很具描述性,特別是因爲這些功能都不是lambda表達式。 – user2357112

+0

'函數()'和'alsoworks()'有一點不同,你不是用'Group()'包裝'OneOrMoreWord()'。如果用'Group()'包裝'OneOrMoreWord()',你會在這兩個函數中得到同樣的錯誤嗎? –

+2

當我看到Group(OneOrMore(Word(alphas)))的輸出時,它會出來(['['boom','baba','boom'],{})],{})' 。當我將該結構傳遞給'「」.join()'我得到一個異常,因爲第一個序列項是一個列表。數據結構是你真正想要的嗎? –

回答

0

根據該文檔,這是一個真正的地獄:(,動作功能應該有3個參數,就像這樣:

def nested_func(origString, loc, tokens): 
    your code; 

這只是發生在第一功能「嗟(P)」,其他人都可以,也許它與組

3

請注意,失敗的版本將解析器定義爲Group(OneOrMore(Word(alphas))),而成功的版本將解析器定義爲只是OneOrMore(Word(alphas)).group將您的單詞列表包含在另一個列表中。 ('','b','c']),但是失敗:''.join([['a','b','c']] )「。你一個不會改變分析動作被調用的方式,你正在改變傳遞給它的令牌的結構,將它們包含在另一層列表中。 (實際上pyparsing返回ParseResults,而不僅僅是列表,ParseResults可以像列表一樣被索引,但是它們也可以有一個命名的結果,就像是一個字典或一個namedtuple,這就是爲什麼打印出這個標記看起來像一個列表+一個字典,但這只是ParseResults的字符串表示,它不是一個列表和字典的元組。)

+0

謝謝。我現在明白'Group'是不必要的,並且導致'join'失敗。我不明白的是爲什麼它會失敗,因爲'nested_func'的一個異常缺少一個必需的位置參數。我想我永遠不會知道。 –

相關問題