| 546 | self._body, self._ns, self._pos, bound_self=obj) |
| 547 | |
| 548 | def _parse_signature(self, args, kw): |
| 549 | values = {} |
| 550 | sig_args, var_args, var_kw, defaults = self._func_signature |
| 551 | extra_kw = {} |
| 552 | for name, value in iteritems(kw): |
| 553 | if not var_kw and name not in sig_args: |
| 554 | raise TypeError( |
| 555 | 'Unexpected argument %s' % name) |
| 556 | if name in sig_args: |
| 557 | values[sig_args] = value |
| 558 | else: |
| 559 | extra_kw[name] = value |
| 560 | args = list(args) |
| 561 | sig_args = list(sig_args) |
| 562 | while args: |
| 563 | while sig_args and sig_args[0] in values: |
| 564 | sig_args.pop(0) |
| 565 | if sig_args: |
| 566 | name = sig_args.pop(0) |
| 567 | values[name] = args.pop(0) |
| 568 | elif var_args: |
| 569 | values[var_args] = tuple(args) |
| 570 | break |
| 571 | else: |
| 572 | raise TypeError( |
| 573 | 'Extra position arguments: %s' |
| 574 | % ', '.join(repr(v) for v in args)) |
| 575 | for name, value_expr in iteritems(defaults): |
| 576 | if name not in values: |
| 577 | values[name] = self._template._eval( |
| 578 | value_expr, self._ns, self._pos) |
| 579 | for name in sig_args: |
| 580 | if name not in values: |
| 581 | raise TypeError( |
| 582 | 'Missing argument: %s' % name) |
| 583 | if var_kw: |
| 584 | values[var_kw] = extra_kw |
| 585 | return values |
| 586 | |
| 587 | |
| 588 | class TemplateObject: |