|
from __future__ import unicode_literals |
|
import sys |
|
import ast |
|
import six |
|
|
|
|
|
class Printer(ast.NodeVisitor): |
|
|
|
def __init__(self, file=sys.stdout, indent=" "): |
|
self.indentation = 0 |
|
self.indent_with = indent |
|
self.f = file |
|
|
|
|
|
def visit(self, node): |
|
super(Printer, self).visit(node) |
|
|
|
def write(self, text): |
|
self.f.write(six.text_type(text)) |
|
|
|
def generic_visit(self, node): |
|
|
|
if isinstance(node, list): |
|
nodestart = "[" |
|
nodeend = "]" |
|
children = [("", child) for child in node] |
|
else: |
|
nodestart = type(node).__name__ + "(" |
|
nodeend = ")" |
|
children = [(name + "=", value) for name, value in ast.iter_fields(node)] |
|
|
|
if len(children) > 1: |
|
self.indentation += 1 |
|
|
|
self.write(nodestart) |
|
for i, pair in enumerate(children): |
|
attr, child = pair |
|
if len(children) > 1: |
|
self.write("\n" + self.indent_with * self.indentation) |
|
if isinstance(child, (ast.AST, list)): |
|
self.write(attr) |
|
self.visit(child) |
|
else: |
|
self.write(attr + repr(child)) |
|
|
|
if i != len(children) - 1: |
|
self.write(",") |
|
self.write(nodeend) |
|
|
|
if len(children) > 1: |
|
self.indentation -= 1 |
|
|