pyparsing 对 asDict() 和 asList() 产生不同的结果

问题描述 投票:0回答:1

我不知道为什么 pyparsing 会为 asDict() 和 asList() 产生不同的结果。请把我推向正确的方向。

import pyparsing as pp


WALRUS = pp.Keyword(':=').suppress()
number = pp.pyparsing_common.number
hex_number = pp.Literal('16#').suppress() + pp.Word(pp.hexnums+'_')
YesNo = pp.CaselessKeyword('YES').setParseAction(lambda t: True)\
        | pp.CaselessKeyword('NO').setParseAction(lambda t: False)
       
dblQuoString = pp.dblQuotedString().addParseAction(pp.removeQuotes)

propertyName = pp.Word(pp.alphas)('key') # + pp.Keyword(':=').suppress()
# value = dblQuoString | YesNo | hex_number | number | pp.Word(pp.alphanums + '.')  # the same result
value = pp.MatchFirst([dblQuoString,
                      YesNo,
                      hex_number,
                      number,
                      pp.Word(pp.alphanums + '.')]
                      )
value.setDebug()

key_value = propertyName + WALRUS + value('value')


if __name__ == "__main__":
    test_string = r"""Description := "Anything" """
    r = key_value.parseString(test_string)
    print(r.asDict())
    print(r.asList())

...和

{'key': 'Description', 'value': ['Anything']}
['Description', 'Anything']

为什么当结果为Dict时'Anything'会被包装到列表中?

我预计 {'key': '描述', 'value': '任何内容'}

python pyparsing
1个回答
0
投票

好吧,这是 pyparsing 的某种魔力,其原因我并不完全清楚。

value = dblQuoString
给出输出
'value': 'Anything'

value = dblQuoString ^ YesNo ^ hex_number ^ number ^ pp.Word(pp.alphanums + '.')
输出列表
'value': ['Anything']

我自己这样决定:

value.addParseAction(lambda t: t[0])
© www.soinside.com 2019 - 2024. All rights reserved.