为什么pyparser的asDict()返回空dict而不是列表?

2024-10-05 10:55:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图编写一个解析器来处理来自注册器的API的响应数据。这种格式不是我以前见过的格式,所以这可能非常简单;如果有人认识到它,请告诉我,并且可能有一个预先存在的库来处理它。但现在我的假设是我需要自己来解析它。在

我的语法是这样的:

equals = Literal("=").suppress()
lbracket = Literal("[").suppress()
rbracket = Literal("]").suppress()
lbrace = Literal("{").suppress()
rbrace = Literal("}").suppress()

value_dict          = Forward()
value_list          = Forward()
value_string        = Word(alphanums + "@. ")

value               = value_list ^ value_dict ^ value_string
values              = Group(delimitedList(value, ","))
value_list          << lbracket + values + rbracket

identifier          = Word(alphanums + "_.")

assignment          = Group(identifier + equals + Optional(value))
assignments         = Dict(delimitedList(assignment, ';'))
value_dict          << lbrace + assignments + rbrace

response = assignments

当我运行这个简单的测试用例时:

^{pr2}$

我得到以下信息:

{'username': 'goat', 'empty_field': '', 'errors': {'username': {}}}

errors['username']应该是一个字符串列表,但显示为空dict。当I.dump()参数时,看起来一切正常:

ss = response.searchString(rsp)
for i in ss:
    print i.dump()

产量:

- empty_field: 
- errors: [['username', ['already taken', 'too short']]]
  - username: ['already taken', 'too short']
- username: goat

我做错什么了?在


Tags: value格式usernamedictlistforwarderrorssuppress
1条回答
网友
1楼 · 发布于 2024-10-05 10:55:11

它是当前版本pyparsing中asDict()的一个幼稚实现。在yoru语法中,可以创建两种不同样式的ParseResults:带有名称的结果和仅为普通列表的结果。asList()只需迭代一个嵌套的ParseResults获取列表和子列表,因此{}的工作原理类似。但是,asDict()确实需要对可能存在的值的类型稍微聪明一点——目前,这是pyparsing中的一个bug。在

编辑

要解决这个问题,您需要做一些工作,将列表存储为实际列表,而不是作为ParseResults。将values表达式重新定义为:

values = delimitedList(value, ",").setParseAction(lambda toks: [toks.asList()])

因为这将返回解析后的列表,而不是ParseResults,而是实际的列表,toDict()不会尝试将其转换为dict

相关问题 更多 >

    热门问题