在pyparsing中自动设置结果名称?
Automatically set results name in pyparsing?
有什么方法可以让 pyparsing 自动将语法元素的 resultsName
设置为我的源代码中指定的任何名称?也就是说,我会写像
这样的代码
my_number = Word(nums)
会自动执行
my_number.setResultsName('my_number')
你应该能够简单地做到:
my_number = Word(nums)('my_number')
使用 .setResultsName
的快捷方式。 Python,一般来说,很难 get at the name 有问题的变量。
作为替代方案,如果您将它们的列表作为字典,您可以执行以下操作:
for key,val in grammar_dict.items():
grammar_dict[key] = val.setResultsName(key)
使用inspect
模块你可以做你想做的事。定义函数 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: 这种方法效果很好,但非常笨拙,并且深入 Python 内部,所以风险自负。
免责声明 2: 这不是我的想法 - 我是从 Whosebug 的某个地方得到的,但我现在不知道确切的位置...
有什么方法可以让 pyparsing 自动将语法元素的 resultsName
设置为我的源代码中指定的任何名称?也就是说,我会写像
my_number = Word(nums)
会自动执行
my_number.setResultsName('my_number')
你应该能够简单地做到:
my_number = Word(nums)('my_number')
使用 .setResultsName
的快捷方式。 Python,一般来说,很难 get at the name 有问题的变量。
作为替代方案,如果您将它们的列表作为字典,您可以执行以下操作:
for key,val in grammar_dict.items():
grammar_dict[key] = val.setResultsName(key)
使用inspect
模块你可以做你想做的事。定义函数 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: 这种方法效果很好,但非常笨拙,并且深入 Python 内部,所以风险自负。
免责声明 2: 这不是我的想法 - 我是从 Whosebug 的某个地方得到的,但我现在不知道确切的位置...