Mercurial > genshi > genshi-test
diff genshi/template/astutil.py @ 934:7c9ec79caedc
Merge r1142 from py3k:
add support for python 3 to genshi.template expression evaluator:
* add support for python 3 AST:
* AST for raise has changed in Python 3.
* Python 3 adds AST nodes for individual arguments and Bytes.
* use genshi.compat functions for dealing with code objects.
* do not coerce byte strings to unicode in Python 3 ASTTransformer.
* replace doctests that reply on exception names with uglier but more compatible try:.. except:.. doctest
* handle filename preferences of Python 2 and 3 (2 prefers bytes, 3 prefers unicode).
* ifilter is gone from itertools in Python 3 so use repeat for tests instead.
author | hodgestar |
---|---|
date | Fri, 18 Mar 2011 09:15:29 +0000 |
parents | 85e4678337cf |
children |
line wrap: on
line diff
--- a/genshi/template/astutil.py +++ b/genshi/template/astutil.py @@ -21,6 +21,7 @@ def parse(source, mode): return compile(source, '', mode, _ast.PyCF_ONLY_AST) +from genshi.compat import IS_PYTHON2 __docformat__ = 'restructuredtext en' @@ -129,6 +130,11 @@ first = False self._write('**' + node.kwarg) + if not IS_PYTHON2: + # In Python 3 arguments get a special node + def visit_arg(self, node): + self._write(node.arg) + # FunctionDef(identifier name, arguments args, # stmt* body, expr* decorator_list) def visit_FunctionDef(self, node): @@ -289,22 +295,36 @@ self._change_indent(-1) - # Raise(expr? type, expr? inst, expr? tback) - def visit_Raise(self, node): - self._new_line() - self._write('raise') - if not node.type: - return - self._write(' ') - self.visit(node.type) - if not node.inst: - return - self._write(', ') - self.visit(node.inst) - if not node.tback: - return - self._write(', ') - self.visit(node.tback) + if IS_PYTHON2: + # Raise(expr? type, expr? inst, expr? tback) + def visit_Raise(self, node): + self._new_line() + self._write('raise') + if not node.type: + return + self._write(' ') + self.visit(node.type) + if not node.inst: + return + self._write(', ') + self.visit(node.inst) + if not node.tback: + return + self._write(', ') + self.visit(node.tback) + else: + # Raise(expr? exc from expr? cause) + def visit_Raise(self, node): + self._new_line() + self._write('raise') + if not node.exc: + return + self._write(' ') + self.visit(node.exc) + if not node.cause: + return + self._write(' from ') + self.visit(node.cause) # TryExcept(stmt* body, excepthandler* handlers, stmt* orelse) def visit_TryExcept(self, node): @@ -626,6 +646,11 @@ def visit_Str(self, node): self._write(repr(node.s)) + if not IS_PYTHON2: + # Bytes(bytes s) + def visit_Bytes(self, node): + self._write(repr(node.s)) + # Attribute(expr value, identifier attr, expr_context ctx) def visit_Attribute(self, node): self.visit(node.value)