diff options
| author | Philipp Volugine <phil.volguine@gmail.com> | 2013-09-10 23:11:26 -0400 |
|---|---|---|
| committer | Philipp Volugine <phil.volguine@gmail.com> | 2013-09-10 23:11:26 -0400 |
| commit | 34c7b280130da85614bb595ab2bb3c50b2270a75 (patch) | |
| tree | 70a67f1d4a165c4cad95eb43cd599a60457f63b0 | |
| parent | 951c174da8f2bc22cb539c74fcb37bd850fd8640 (diff) | |
| download | external_python_mako-34c7b280130da85614bb595ab2bb3c50b2270a75.tar.gz external_python_mako-34c7b280130da85614bb595ab2bb3c50b2270a75.tar.bz2 external_python_mako-34c7b280130da85614bb595ab2bb3c50b2270a75.zip | |
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
| -rw-r--r-- | mako/_ast_util.py | 13 | ||||
| -rw-r--r-- | mako/ast.py | 5 | ||||
| -rw-r--r-- | 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='<unknown>', 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): |
