2012-10-23 6 views
2

이 문제는 pyparsing 및 python 2.7의 일반적인 문제입니다 (3에서 잘 작동 함). 일반적인 구조는 이것이다 :python 2.7에서 setParseAction 메서드를 사용하면 예외가 throw됩니다.

그러나 나는

Parsing error : some_action() takes exactly 4 arguments (1 given) 

내 질문이 두 버전에서 작동하는 방법입니다 얻을 2.7에서 잘 작동 pyparsing python3에서

class SomeParser(object): 

    def some_action(self, string, loc, tok): 
     print("action") 

    def gramma(self): 
      ...pyparsing gramma for some 

      language.... 
     some_rule = (token + token2).setParseAction(self.some_action) 
     return some_rule 

    def parse(self, string): 
     self.gramma().parseString(string) 
     return True 

?

편집 : 일부 테스트 후 나는 그것이 클래스 메쏘드뿐만 아니라 일반적인 문제라는 것을 발견했다.

답변

1

은 내가 setParseAction(func)에서 FUNC 수용되는 인수의 수를 추측하려고 pyparsing 1.5.6과 그 _trim_arity 기능에, (친구의 도움으로) 문제를 찾은 것 같아요. 이미 고정되어 대한 파싱에

if not _PY3K and False:                                        
    def _trim_arity(func, maxargs=2):                                     
     limit = [0]                                         
     def wrapper(*args):                                       
      while 1:                                         
       try:                                         
        return func(*args[limit[0]:])                                  
       except TypeError:                                      
        if limit[0] <= maxargs:                                   
         limit[0] += 1                                     
         continue                                      
        raise                                        
     return wrapper                                         
    else:                                             
     def _trim_arity(func, maxargs=2):                                     
      # limit = maxargs                                        
      def wrapper(*args):                                       
       limit = maxargs                                       
       #~ nonlocal limit                                       
       while 1:                                         
        try:                                         
         return func(*args[limit:])                                   
        except TypeError:                                      
         if limit:                                       
          limit -= 1                                      
          continue                                      
         raise                                        
      return wrapper 

매우 우아하지하지만 난 trunk 버전에서 그것을 볼 수 있습니다

if not _PY3K:                                        
    def _trim_arity(func, maxargs=2):                                     
     limit = [0]                                         
     def wrapper(*args):                                       
      while 1:                                         
       try:                                         
        return func(*args[limit[0]:])                                  
       except TypeError:                                      
        if limit[0] <= maxargs:                                   
         limit[0] += 1                                     
         continue                                      
        raise                                        
     return wrapper                                         
    else:                                             
     def _trim_arity(func, maxargs=2):                                     
      limit = maxargs                                        
      def wrapper(*args):                                                                            
       #~ nonlocal limit                                       
       while 1:                                         
        try:                                         
         return func(*args[limit:])                                   
        except TypeError:                                      
         if limit:                                       
          limit -= 1                                      
          continue                                      
         raise                                        
      return wrapper 

에 : 나는에서 변경.

+0

예, 필자는 '_trim_arity' 함수가 pyparsing에서 많은 자극적 오류를 일으키는 것을 발견했습니다. – BrenBarn

+0

트렁크에서 @BrenBarn fortunatelly이 문제가 수정되었으며, 잠시 동안 최적화되어 있다고 생각합니다. 그 동안은 좋은 해결 방법입니다. – Darek

관련 문제