Python 是否在pyparsing中自动设置结果名称?
有没有办法让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很难定义所讨论的变量的类型 另一种选择是,如果你有一个列表
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())。这也会引发原型模式,其中使用现有实例创建新实例。