文法要素のresultsName
を自動的にソースコードに名前を付けたものに自動的に設定する方法はありますか?つまり、私はpyparsingで自動的に結果名を設定しますか?
my_number = Word(nums)
ようなコードを記述し、それが自動的にあなたは単純に行うことができるはず
my_number.setResultsName('my_number')
文法要素のresultsName
を自動的にソースコードに名前を付けたものに自動的に設定する方法はありますか?つまり、私はpyparsingで自動的に結果名を設定しますか?
my_number = Word(nums)
ようなコードを記述し、それが自動的にあなたは単純に行うことができるはず
my_number.setResultsName('my_number')
を実行します:
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)
あなたがやりたいことができます。機能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
がresultsName
として "my_number
" が含まれています。
免責事項1:このアプローチはうまくいきますが、かなりハッキリで、Pythonの内部に潜んでいるので、自己責任で行ってください。
免責事項2:このためのアイデアは私のものではありません - 私はどこかのStackOverflowからそれを得たが、私は今まさにどこ...
'setResultsName'は*のコピーを作成し、返すことに注意してください*のありません元の式なので、下位レベルの式を上位レベルの式にアセンブルするときには必ずコピーを使用してください。 – PaulMcG
ありがとうございます。このショートカットは他にどのような機能を備えていますか?例えば'expression = Forward()( 'expression')'と書くことができますか? –
AFAIKあなたは_all_ pyparsing式のためにそれを使用できるはずです。文法が複雑になると本当に便利です! – Hooked