在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 的某个地方得到的,但我现在不知道确切的位置...