89 t = self.parse(tokeniter) |
89 t = self.parse(tokeniter) |
90 if self._methods: |
90 if self._methods: |
91 return self.eval(t) |
91 return self.eval(t) |
92 return t |
92 return t |
93 |
93 |
|
94 def buildargsdict(trees, funcname, keys, keyvaluenode, keynode): |
|
95 """Build dict from list containing positional and keyword arguments |
|
96 |
|
97 Invalid keywords or too many positional arguments are rejected, but |
|
98 missing arguments are just omitted. |
|
99 """ |
|
100 if len(trees) > len(keys): |
|
101 raise error.ParseError(_("%(func)s takes at most %(nargs)d arguments") |
|
102 % {'func': funcname, 'nargs': len(keys)}) |
|
103 args = {} |
|
104 # consume positional arguments |
|
105 for k, x in zip(keys, trees): |
|
106 if x[0] == keyvaluenode: |
|
107 break |
|
108 args[k] = x |
|
109 # remainder should be keyword arguments |
|
110 for x in trees[len(args):]: |
|
111 if x[0] != keyvaluenode or x[1][0] != keynode: |
|
112 raise error.ParseError(_("%(func)s got an invalid argument") |
|
113 % {'func': funcname}) |
|
114 k = x[1][1] |
|
115 if k not in keys: |
|
116 raise error.ParseError(_("%(func)s got an unexpected keyword " |
|
117 "argument '%(key)s'") |
|
118 % {'func': funcname, 'key': k}) |
|
119 if k in args: |
|
120 raise error.ParseError(_("%(func)s got multiple values for keyword " |
|
121 "argument '%(key)s'") |
|
122 % {'func': funcname, 'key': k}) |
|
123 args[k] = x[2] |
|
124 return args |
|
125 |
94 def _prettyformat(tree, leafnodes, level, lines): |
126 def _prettyformat(tree, leafnodes, level, lines): |
95 if not isinstance(tree, tuple) or tree[0] in leafnodes: |
127 if not isinstance(tree, tuple) or tree[0] in leafnodes: |
96 lines.append((level, str(tree))) |
128 lines.append((level, str(tree))) |
97 else: |
129 else: |
98 lines.append((level, '(%s' % tree[0])) |
130 lines.append((level, '(%s' % tree[0])) |