If you change the definition courseto
course = (DEPT_CODE + COURSE_NUMBER).setResultsName("Course")
you will get the following behavior:
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]
This is not exactly what you need, but is it enough?
Please note from the documentation :
[setResultsName] returns a copy of the original ParserElement object; this is so that the client can identify a basic element, such as an integer, and refer to it in several places with different names.
course.setResultsName("Course") , course. course=course.setResultsName("Course"). , .