2010-05-30 3 views
3

Je pense que je fais une erreur dans la façon dont j'appelle setResultsName():Python/pyparsing: Difficulté avec setResultsName

from pyparsing import * 

DEPT_CODE = Regex(r'[A-Z]{2,}').setResultsName("Dept Code") 
COURSE_NUMBER = Regex(r'[0-9]{4}').setResultsName("Course Number") 

COURSE_NUMBER.setParseAction(lambda s, l, toks : int(toks[0])) 

course = DEPT_CODE + COURSE_NUMBER 

course.setResultsName("course") 

statement = course 

De IDLE:

>>> myparser import * 
>>> statement.parseString("CS 2110") 
(['CS', 2110], {'Dept Code': [('CS', 0)], 'Course Number': [(2110, 1)]}) 

La sortie je l'espère:

>>> myparser import * 
>>> statement.parseString("CS 2110") 
(['CS', 2110], {'Course': ['CS', 2110], 'Dept Code': [('CS', 0)], 'Course Number': [(2110, 1)]}) 

Est-ce que setResultsName() ne fonctionne que pour les terminaux?

Répondre

5

Si vous modifiez la définition de course à

course = (DEPT_CODE + COURSE_NUMBER).setResultsName("Course") 

vous obtenez le comportement suivant:

x=statement.parseString("CS 2110") 
print(repr(x)) 
# (['CS', 2110], {'Course': [((['CS', 2110], {'Dept Code': [('CS', 0)], 'Course Number': [(2110, 1)]}), 0)], 'Dept Code': [('CS', 0)], 'Course Number': [(2110, 1)]}) 
print(x['Dept Code']) 
# CS 
print(x['Course Number']) 
# 2110 
print(x['Course']) 
# ['CS', 2110] 

Ce n'est pas exactement le repr que vous vouliez, mais il ne suffit?

Note, from the docs:

[setResultsName] renvoie une copie de l'objet ParserElement d'origine; c'est ainsi que le client peut définir un élément de base, tel qu'un entier, et le référencer en plusieurs endroits avec des noms différents.

Donc course.setResultsName("Course") ne fonctionne pas car il n'affecte pas course. Vous devriez plutôt dire course=course.setResultsName("Course"). C'est une façon alternative de faire ce que j'ai fait ci-dessus.

+0

Que fait 'repr()'? –

+0

En outre, il semble que 'setResultsName()' renvoie une copie, mais 'setParseAction()' ne pas - pourquoi l'incohérence? Ou est-ce que je me trompe? –

+0

@Rosarch: 'repr()' retourne une représentation sous forme de chaîne de l'objet. Il donne souvent une vue plus complète des données à l'intérieur d'un objet que 'str()'. Je pense que vous avez raison: 'setParseAction' renvoie' self', tandis que 'setResultName' renvoie une copie. Je ne suis pas assez éclairé pour expliquer pourquoi c'est ainsi. – unutbu