2014-03-14 5 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)) 모든 것이 잘 작동합니다. 나는 혼란 스럽다. 의 내용이nested_func은 PyParsing 으로 바뀌는 이유는 무엇입니까?

저는 Python 3.3.3 및 PyParsing 2.0.1과 함께 제공되는 WinPython을 사용하고 있습니다.

+1

왜 함수 이름을 lambda_func로 지정합니까? 그 기능이 람다가 아니기 때문에 그다지 잘 설명하지 못합니다. – user2357112

+0

'function()'과'alsoworks()'에서 다른 점은'OneOrMoreWord()'를'Group()'으로 래핑하지 않는다는 것입니다. 'OneOrMoreWord()'를'Group()'으로 랩핑하면 두 함수에서 같은 오류가 발생합니까? –

+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))으로 정의합니다. 그룹은 단어 목록을 다른 목록에 포함합니다. ('['a ','b ','c ']]). 그러나 이것은 실패합니다.) ". 당신은 구문 분석 조치가 호출되는 방식을 변경하지 않으면 전달되는 토큰의 구조를 변경하여 다른 수준의 목록으로 묶습니다.

(실제 pyparsing은 목록뿐만 아니라 ParseResults를 반환합니다 .ParseResults는 목록처럼 색인화 될 수 있지만 dict 또는 namedtuple과 같은 이름 지정된 결과를 가질 수도 있습니다. 따라서 토큰을 인쇄하는 것이 목록처럼 보입니다 + dict,하지만 이것은 ParseResults의 문자열 표현 일 뿐이며 실제로 목록과 딕트의 튜플이 아닙니다.)

+0

감사합니다. 이제는 '그룹'이 불필요하고 '합류'를 실패하게되었습니다. 내가 이해할 수없는 것은 'nested_func'가 필수 위치 인수를 빠뜨린 것에 대한 예외로 실패하는 이유입니다. 나는 결코 알지 못할 것 같아. –