# HG changeset patch # User hodgestar # Date 1392579381 0 # Node ID a5e09a7ba12d16c95cd57cd42bc4a9631e18cd34 # Parent 2036193f89e769b4a4f42edc8490d9063af60c4b Add support for kwonlyargs and kw_defaults attributes of AST argument nodes. diff --git a/genshi/template/astutil.py b/genshi/template/astutil.py --- a/genshi/template/astutil.py +++ b/genshi/template/astutil.py @@ -111,32 +111,35 @@ # arguments = (arg* args, arg? vararg, arg* kwonlyargs, expr* kw_defaults, # arg? kwarg, expr* defaults) def visit_arguments(self, node): - first = True - no_default_count = len(node.args) - len(node.defaults) - for i, arg in enumerate(node.args): - if not first: - self._write(', ') + def write_possible_comma(): + if _first[0]: + _first[0] = False else: - first = False - self.visit(arg) - if i >= no_default_count: - self._write('=') - self.visit(node.defaults[i - no_default_count]) + self._write(', ') + _first = [True] + + def write_args(args, defaults): + no_default_count = len(args) - len(defaults) + for i, arg in enumerate(args): + write_possible_comma() + self.visit(arg) + default_idx = i - no_default_count + if default_idx >= 0 and defaults[default_idx] is not None: + self._write('=') + self.visit(defaults[i - no_default_count]) + + write_args(node.args, node.defaults) if getattr(node, 'vararg', None): - if not first: - self._write(', ') - else: - first = False + write_possible_comma() self._write('*') if isstring(node.vararg): self._write(node.vararg) else: self.visit(node.vararg) + if getattr(node, 'kwonlyargs', None): + write_args(node.kwonlyargs, node.kw_defaults) if getattr(node, 'kwarg', None): - if not first: - self._write(', ') - else: - first = False + write_possible_comma() self._write('**') if isstring(node.kwarg): self._write(node.kwarg) diff --git a/genshi/template/eval.py b/genshi/template/eval.py --- a/genshi/template/eval.py +++ b/genshi/template/eval.py @@ -514,6 +514,9 @@ if hasattr(node, 'args'): for arg in node.args: self._process(names, arg) + if hasattr(node, 'kwonlyargs'): + for arg in node.kwonlyargs: + self._process(names, arg) if hasattr(node, 'vararg'): self._process(names, node.vararg) if hasattr(node, 'kwarg'): diff --git a/genshi/template/tests/eval.py b/genshi/template/tests/eval.py --- a/genshi/template/tests/eval.py +++ b/genshi/template/tests/eval.py @@ -590,6 +590,29 @@ suite.execute(data) self.assertEqual(['bardef', 'fooabc'], sorted(data['x'])) + if not IS_PYTHON2: + def test_def_kwonlyarg(self): + suite = Suite(""" +def kwonly(*args, k): + return k +x = kwonly(k="foo") +""") + data = {} + suite.execute(data) + self.assertEqual("foo", data['x']) + + def test_def_kwonlyarg_with_default(self): + suite = Suite(""" +def kwonly(*args, k="bar"): + return k +x = kwonly(k="foo") +y = kwonly() +""") + data = {} + suite.execute(data) + self.assertEqual("foo", data['x']) + self.assertEqual("bar", data['y']) + def test_def_nested(self): suite = Suite(""" def doit():