2017-02-10 4 views
3

pyparsing을 통해 문법 요소의 resultsName을 자동으로 내 소스 코드에 지정된 이름으로 설정할 수 있습니까?pyparsing에서 자동으로 결과 이름을 설정합니까?

my_number = Word(nums)('my_number') 

.setResultsName의 바로 가기를 사용하여 : 그건 내가

my_number = Word(nums) 

과 같은 코드를 작성합니다 및 자동으로 당신은 간단하게 할 수 있어야한다

my_number.setResultsName('my_number') 

답변

3

을 실행하는 것입니다. 일반적으로 파이썬은 문제의 변수 인 get at the name을 어렵게 만듭니다. 대안으로

, 당신은 당신이 좋아하는 일을 할 수있는 사전로의 목록을 한 경우 : inspect 모듈을 사용

for key,val in grammar_dict.items(): 
    grammar_dict[key] = val.setResultsName(key) 
+1

참고 지금은하지 않습니다 원래 표현식이므로 하위 수준 표현식을 상위 수준 표현식으로 어셈블 할 때 사본을 사용해야합니다. – PaulMcG

+0

감사합니다. 이 단축키는 다른 어떤 기능과 작동합니까? 예 : 'expression = Forward() ('expression')'이라고 쓸 수 있습니까? –

+1

AFAIK 당신은 _all_ pyparsing 표현식을 위해 그것을 사용할 수 있어야합니다. 문법이 복잡 해지면 정말 편리합니다! – Hooked

2

당신은 당신이 원하는 것을 할 수 있습니다. 함수 srn을 정의

import inspect 

def srn(expr): 
    """Sets the results name to the variable *name* of `expr`""" 
    cf = inspect.currentframe() 
    of = inspect.getouterframes(cf)[1] 
    fs = inspect.getframeinfo(of[0]).code_context[0].strip() 

    # name of FIRST parameter 
    try: 
     args = fs[fs.find('(') + 1:-1].split(',') 
     n = args[0] 
     if n.find('=') != -1: 
      name = n.split('=')[1].strip() 
     else: 
      name = n 
     expr.resultsName = name 
    except IndexError: 
     pass 
    return expr 

그런 my_number = Word(nums) 호출 후 :

srn(my_number) 

my_number는 "my_number"resultsName으로 포함되어 있습니다.

면책 조항 1 :이 접근법은 잘 작동하지만 꽤 위험하고 파이썬 내부 깊숙이 잠입하므로 위험 부담은 따로 둡니다.

면책 조항 2 :이에 대한 아이디어는 내되지 않습니다 - I에 유래에서 어딘가에있어하지만 난 setResultsName`이 *의 수와 * 사본을 반환`것을 정확히 어디에 ...