Присоединение действия синтаксического анализа, которое возвращает только токены, к анализатору, который генерирует одну группу в списке ParseResults, создает словарь с двойным вложением (result3).
Я разместил этот вопрос на странице pyparsing GitHub Issues , рассматривая его как несоответствие. Но, возможно, это не так, и я просто не понимаю, объекты ParseResults. Ниже я немного расширил свои наблюдения.
from __future__ import print_function
from pyparsing import *
name = Word(alphas)('name')
score = Word(nums + '.')('score')
nameScore = Group(name + score)
line1 = nameScore('Rider')
line2 = nameScore('Rider') + nameScore('Bull')
result1 = line1.parseString('Mauney 46.5')
result2 = line2.parseString('Mauney 46.5 Asteroid 46')
print("### before parse action is added ###")
print("result1.dump():\n" + result1.dump() + "\n")
print("result2.dump():\n" + result2.dump() + "\n")
line1.setParseAction(lambda t: t)
line2.setParseAction(lambda t: t)
result3 = line1.parseString('Mauney 46.5')
result4 = line2.parseString('Mauney 46.5 Asteroid 46')
print("### after parse action was added ###")
print("result3.dump():\n" + result3.dump() + "\n")
print("result4.dump():\n" + result4.dump() + "\n")
Выполнение вышеуказанных результатов приводит к следующему.
### before parse action is added ###
result1.dump():
[['Mauney', '46.5']]
- Rider: ['Mauney', '46.5']
- name: 'Mauney'
- score: '46.5'
result2.dump():
[['Mauney', '46.5'], ['Asteroid', '46']]
- Bull: ['Asteroid', '46']
- name: 'Asteroid'
- score: '46'
- Rider: ['Mauney', '46.5']
- name: 'Mauney'
- score: '46.5'
### after parse action was added ###
result3.dump():
[['Mauney', '46.5']]
- Rider: [['Mauney', '46.5']] <=================
- Rider: ['Mauney', '46.5']
- name: 'Mauney'
- score: '46.5'
result4.dump():
[['Mauney', '46.5'], ['Asteroid', '46']]
- Bull: ['Asteroid', '46']
- name: 'Asteroid'
- score: '46'
- Rider: ['Mauney', '46.5']
- name: 'Mauney'
- score: '46.5'
Похоже, что внешний объект ParseResults является частью своего собственного словаря.
Это ожидаемое поведение, и если да, то почему оно происходит?
Некоторые дальнейшие наблюдения.
Если список ParseResults содержит две группы, двойное вложение отсутствует (результат 2).
Если действие разбора для line1
изменено на
line1.setParseAction(lambda t: [t[0]])
желаемый результат получается:
result1.dump():
[['Mauney', '46.5']]
- Rider: ['Mauney', '46.5']
- name: 'Mauney'
- score: '46.5'