2017-02-10 9 views
3

文法要素のresultsNameを自動的にソースコードに名前を付けたものに自動的に設定する方法はありますか?つまり、私はpyparsingで自動的に結果名を設定しますか?

my_number = Word(nums) 

ようなコードを記述し、それが自動的にあなたは単純に行うことができるはず

my_number.setResultsName('my_number') 

答えて

3

を実行します:

my_number = Word(nums)('my_number') 

.setResultsNameのショートカットを使用して。一般的に、Pythonは問題の変数のget at the nameを難しくします。代替案として

、あなたはあなたのような何かを行うことができ辞書としてそれらのリストを持っていた場合: inspectモジュールを使用して

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

'setResultsName'は*のコピーを作成し、返すことに注意してください*のありません元の式なので、下位レベルの式を上位レベルの式にアセンブルするときには必ずコピーを使用してください。 – 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_numberresultsNameとして "my_number" が含まれています。

免責事項1:このアプローチはうまくいきますが、かなりハッキリで、Pythonの内部に潜んでいるので、自己責任で行ってください。

免責事項2:このためのアイデアは私のものではありません - 私はどこかのStackOverflowからそれを得たが、私は今まさにどこ...

関連する問題