我在一个类中有一个pyparsing变量:

def takeval(type, name, value):
     #do stuff with args
    
self.variable = pp.Optional(self.let_ | self.const_ | self.var_).set_results_name('vartype') ^ self.varname ^ self.set_ ^ self.object
#I want to set the function

self.variable = self.variable.setParseAction(takeval(vartype, varname, object))

如何从解析操作中获取vartype、varname和object的值?

  • 我希望vartype是其中一个的值:self.让我们,赛尔夫.const_u或self.风险值_
  • 我想让varname成为self 的价值.变量名
  • 我反对成为self 的价值.对象

目标输出示例:

我解析字符串:'const hi = "hello"'

我希望'const', 'hi', 'hello'被发送到目标函数.

感谢您的帮助!

推荐答案

我甚至有三个版本给你.

  • 版本1需要 for each 解析器操作单独调用解析器操作.
  • Verison 2只需要一个这样的函数.
  • 版本3不需要这样的代码,但调用方代码不再那么好了.

通常我经常使用结果名称.但为了简化,我在这个例子中没有这样做.

from pyparsing import *

class Parser:
    
  def takeval(self, type, name, value):
    print("Type is " + type)
    print("Name is " + name)
    print("Value is "+ value)
  
  # For version 1
  def call_takeval(self, s, loc, toks):
    self.takeval(toks[0], toks[1], toks[2])
  
  # For version 2
  def as_parse_action(self, parse_action):
    def call_parse_action(s, loc, toks):
      parse_action(toks[0], toks[1], toks[2])
    return call_parse_action
  
  
  def __init__(self):
  
    self.let_ = Literal("let")
    self.const_ = Literal("const")
    self.var_ = Literal("var")
    self.varname = Word(alphas)
    self.set_ = Literal("=")
    self.obj = Literal('"').suppress() + Word(alphas) + Literal('"').suppress()
    
    self.variable_version_1 = Optional(self.let_ | self.const_ | self.var_).setResultsName('vartype') \
        + self.varname.setResultsName('varname') + self.set_.suppress() + self.obj.setResultsName('varobj')
    
    self.variable_version_2 = Optional(self.let_ | self.const_ | self.var_).setResultsName('vartype') \
        + self.varname.setResultsName('varname') + self.set_.suppress() + self.obj.setResultsName('varobj')
    
    self.variable_version_3 = Optional(self.let_ | self.const_ | self.var_).setResultsName('vartype') \
        + self.varname.setResultsName('varname') + self.set_.suppress() + self.obj.setResultsName('varobj')

    self.variable_version_1 = self.variable_version_1.setParseAction(self.call_takeval)
    
    self.variable_version_2 = self.variable_version_2.setParseAction(self.as_parse_action(self.takeval))
    
    self.variable_version_3 = self.variable_version_2.setParseAction( \
        lambda s, loc, toks : self.takeval(toks[0], toks[1], toks[2]))
    
    
    
  def parse(self, text):
    print("Version 1:")
    self.variable_version_1.parseString(text)
    print("Version 2:")
    self.variable_version_2.parseString(text)
    print("Version 3:")
    self.variable_version_3.parseString(text)



test_string = 'const hi = "hello"'
parser = Parser()
parser.parse(test_string)

Python相关问答推荐

ModuleNotFound错误:没有名为flags.State的模块; flags不是包

Stacked bar chart from billrame

在ubuntu上安装dlib时出错

多处理队列在与Forking http.server一起使用时随机跳过项目

索引到 torch 张量,沿轴具有可变长度索引

Django—cte给出:QuerySet对象没有属性with_cte''''

如何从列表框中 Select 而不出错?

Tkinter菜单自发添加额外项目

如何使用Numpy. stracards重新编写滚动和?

将一个双框爆炸到另一个双框的范围内

判断Python操作:如何从字面上得到所有decorator ?

如何求相邻对序列中元素 Select 的最小代价

如何强制向量中的特定元素在Gekko中处于优化解决方案中

jsonschema日期格式

获取PANDA GROUP BY转换中的组的名称

Python OPCUA,modbus通信代码运行3小时后出现RuntimeError

比较两个有条件的数据帧并删除所有不合格的数据帧

与同步和异步客户端兼容的Python函数

函数()参数';代码';必须是代码而不是字符串

用LAKEF划分实木地板AWS Wrangler