152 if not varkey and kwstart > len(poskeys) + len(keys): |
152 if not varkey and kwstart > len(poskeys) + len(keys): |
153 raise error.ParseError(_("%(func)s takes at most %(nargs)d positional " |
153 raise error.ParseError(_("%(func)s takes at most %(nargs)d positional " |
154 "arguments") |
154 "arguments") |
155 % {'func': funcname, |
155 % {'func': funcname, |
156 'nargs': len(poskeys) + len(keys)}) |
156 'nargs': len(poskeys) + len(keys)}) |
157 args = {} |
157 args = util.sortdict() |
158 # consume positional arguments |
158 # consume positional arguments |
159 for k, x in zip(poskeys, trees[:kwstart]): |
159 for k, x in zip(poskeys, trees[:kwstart]): |
160 args[k] = x |
160 args[k] = x |
161 if varkey: |
161 if varkey: |
162 args[varkey] = trees[len(args):kwstart] |
162 args[varkey] = trees[len(args):kwstart] |
163 else: |
163 else: |
164 for k, x in zip(keys, trees[len(args):kwstart]): |
164 for k, x in zip(keys, trees[len(args):kwstart]): |
165 args[k] = x |
165 args[k] = x |
166 # remainder should be keyword arguments |
166 # remainder should be keyword arguments |
167 if optkey: |
167 if optkey: |
168 args[optkey] = {} |
168 args[optkey] = util.sortdict() |
169 for x in trees[kwstart:]: |
169 for x in trees[kwstart:]: |
170 if x[0] != keyvaluenode or x[1][0] != keynode: |
170 if x[0] != keyvaluenode or x[1][0] != keynode: |
171 raise error.ParseError(_("%(func)s got an invalid argument") |
171 raise error.ParseError(_("%(func)s got an invalid argument") |
172 % {'func': funcname}) |
172 % {'func': funcname}) |
173 k = x[1][1] |
173 k = x[1][1] |