구문 분석 작업으로 사용되는 중첩 함수 내에 " ".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을 사용하고 있습니다.
왜 함수 이름을 lambda_func로 지정합니까? 그 기능이 람다가 아니기 때문에 그다지 잘 설명하지 못합니다. – user2357112
'function()'과'alsoworks()'에서 다른 점은'OneOrMoreWord()'를'Group()'으로 래핑하지 않는다는 것입니다. 'OneOrMoreWord()'를'Group()'으로 랩핑하면 두 함수에서 같은 오류가 발생합니까? –
'Group (OneOrMore (Word (alphas))'의 출력을 보면'([('boom', 'baba', 'boom'], {})],' . 그 구조체를'' ".join()'에 전달할 때 첫 번째 시퀀스 항목이리스트이므로 예외가 발생합니다. 당신이 정말로 원하는 데이터 구조입니까? –