Python 是否在pyparsing中自动设置结果名称?

Python 是否在pyparsing中自动设置结果名称?,python,pyparsing,Python,Pyparsing,有没有办法让pyparsing自动将语法元素的resultsName设置为我的源代码中的任何名称?也就是说,我会像这样编写代码 my_number = Word(nums) 它会自动执行 my_number.setResultsName('my_number') 您应该能够简单地执行以下操作: my_number = Word(nums)('my_number') 使用.setResultsName的快捷方式。一般来说,Python很难定义所讨论的变量的类型 另一种选择是,如果你有一个列表

有没有办法让pyparsing自动将语法元素的
resultsName
设置为我的源代码中的任何名称?也就是说,我会像这样编写代码

my_number = Word(nums)
它会自动执行

my_number.setResultsName('my_number')

您应该能够简单地执行以下操作:

my_number = Word(nums)('my_number')
使用
.setResultsName
的快捷方式。一般来说,Python很难定义所讨论的变量的类型

另一种选择是,如果你有一个列表作为字典,你可以这样做:

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:这不是我的想法-我从StackOverflow的某个地方得到它,但我现在不知道确切的位置…

注意,
setResultsName
制作并返回原始表达式的副本,因此在将低级表达式组装成高级表达式时,请务必使用副本。谢谢。此快捷方式还可以使用哪些其他功能?e、 g.我可以写
expression=Forward()('expression')
?好的,您应该可以将它用于所有的pyparsing表达式。当语法变得复杂时,它真的很有用!您也可以只使用
()
复制一个表达式,当我想在大型语法中的某一点上使用一个特殊形式的通用表达式(如
quotedString
)时,我发现这很有用,但我不想更改使用
quotedString
的所有其他位置。类似于带引号的数字字符串=quotedString().addCondition(lambda t:t[0][1:-1].isdigit())。这也会引发原型模式,其中使用现有实例创建新实例。