|
|
- import ast
- import gast
-
-
- def _generate_translators(to):
-
- class Translator(ast.NodeTransformer):
-
- def _visit(self, node):
- if isinstance(node, list):
- return [self._visit(n) for n in node]
- elif isinstance(node, ast.AST):
- return self.visit(node)
- else:
- return node
-
- def generic_visit(self, node):
- cls = type(node).__name__
- # handle nodes that are not part of the AST
- if not hasattr(to, cls):
- return
- new_node = getattr(to, cls)()
- for field in node._fields:
- setattr(new_node, field, self._visit(getattr(node, field)))
- for attr in getattr(node, '_attributes'):
- if hasattr(node, attr):
- setattr(new_node, attr, getattr(node, attr))
- return new_node
-
- return Translator
-
- AstToGAst = _generate_translators(gast)
- GAstToAst = _generate_translators(ast)
|