From 34c7b280130da85614bb595ab2bb3c50b2270a75 Mon Sep 17 00:00:00 2001 From: Philipp Volugine Date: Tue, 10 Sep 2013 23:11:26 -0400 Subject: added arg_stringname function to _ast_util.py This is to be compatible with python3.4 where kwarg and vararg objects are _ast.arg as opposed to Name objects in earlier versions. The _ast.arg object cannot be implicitly converted to a string. This lead to 4 errors in the test suite. As of this commit all tests pass under python3.4a2 --- mako/_ast_util.py | 13 +++++++++++-- mako/ast.py | 5 +++-- mako/pyparser.py | 6 +++--- 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/mako/_ast_util.py b/mako/_ast_util.py index 5b1a8e4..2c6cbc7 100644 --- a/mako/_ast_util.py +++ b/mako/_ast_util.py @@ -78,6 +78,15 @@ ALL_SYMBOLS.update(BINOP_SYMBOLS) ALL_SYMBOLS.update(CMPOP_SYMBOLS) ALL_SYMBOLS.update(UNARYOP_SYMBOLS) +def arg_stringname(func_arg): + """Gets the string name of a kwarg or vararg + In Python3.4 a function's args are + of _ast.arg type not _ast.name + """ + if hasattr(func_arg, 'arg'): + return func_arg.arg + else: + return str(func_arg) def parse(expr, filename='', mode='exec'): """Parse an expression into an AST node.""" @@ -403,10 +412,10 @@ class SourceGenerator(NodeVisitor): self.visit(default) if node.vararg is not None: write_comma() - self.write('*' + node.vararg) + self.write('*' + arg_stringname(node.vararg)) if node.kwarg is not None: write_comma() - self.write('**' + node.kwarg) + self.write('**' + arg_stringname(node.kwarg)) def decorators(self, node): for decorator in node.decorator_list: diff --git a/mako/ast.py b/mako/ast.py index 0d3f0b1..cd1d14e 100644 --- a/mako/ast.py +++ b/mako/ast.py @@ -8,6 +8,7 @@ code, as well as generating Python from AST nodes""" from mako import exceptions, pyparser, compat +from mako._ast_util import arg_stringname import re class PythonCode(object): @@ -126,10 +127,10 @@ class FunctionDecl(object): for arg in argnames: default = None if kwargs: - arg = "**" + arg + arg = "**" + arg_stringname(arg) kwargs = False elif varargs: - arg = "*" + arg + arg = "*" + arg_stringname(arg) varargs = False else: default = len(defaults) and defaults.pop() or None diff --git a/mako/pyparser.py b/mako/pyparser.py index 5499076..be292a8 100644 --- a/mako/pyparser.py +++ b/mako/pyparser.py @@ -11,6 +11,7 @@ module is used. """ from mako import exceptions, util, compat +from mako._ast_util import arg_stringname from mako.compat import StringIO import operator @@ -215,15 +216,14 @@ if _ast: self.listener.funcname = node.name argnames = [arg_id(arg) for arg in node.args.args] if node.args.vararg: - argnames.append(node.args.vararg) + argnames.append(arg_stringname(node.args.vararg)) if node.args.kwarg: - argnames.append(node.args.kwarg) + argnames.append(arg_stringname(node.args.kwarg)) self.listener.argnames = argnames self.listener.defaults = node.args.defaults # ast self.listener.varargs = node.args.vararg self.listener.kwargs = node.args.kwarg - class ExpressionGenerator(object): def __init__(self, astnode): -- cgit v1.2.3