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
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(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='<unknown>', mode='exec'):
"""Parse an expression into an AST node."""
@@ -403,10 +412,10 @@
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 @@
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 @@
"""
from mako import exceptions, util, compat
+from mako._ast_util import arg_stringname
from mako.compat import StringIO
import operator
@@ -215,15 +216,14 @@
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):