import ast
def build_tree(node):
def _visit(node, level=0):
if isinstance(node, (ast.ClassDef, ast.FunctionDef)):
yield node.name, level
level += 1
for child in ast.iter_child_nodes(node):
yield from _visit(child, level)
return '\n'.join(f'{" " * level}{name}' for name, level in _visit(node))
source = '''
class Foo:
def method1(self):
pass
def method2(self):
pass
class Bar:
def method1(self):
pass
def method2(self):
pass
'''
print(build_tree(ast.parse(source)))
aW1wb3J0IGFzdAoKZGVmIGJ1aWxkX3RyZWUobm9kZSk6CiAgICBkZWYgX3Zpc2l0KG5vZGUsIGxldmVsPTApOgogICAgICAgIGlmIGlzaW5zdGFuY2Uobm9kZSwgKGFzdC5DbGFzc0RlZiwgYXN0LkZ1bmN0aW9uRGVmKSk6CiAgICAgICAgICAgIHlpZWxkIG5vZGUubmFtZSwgbGV2ZWwKICAgICAgICAgICAgbGV2ZWwgKz0gMQogICAgICAgIGZvciBjaGlsZCBpbiBhc3QuaXRlcl9jaGlsZF9ub2Rlcyhub2RlKToKICAgICAgICAgICAgeWllbGQgZnJvbSBfdmlzaXQoY2hpbGQsIGxldmVsKQogICAgcmV0dXJuICdcbicuam9pbihmJ3siICAgICIgKiBsZXZlbH17bmFtZX0nIGZvciBuYW1lLCBsZXZlbCBpbiBfdmlzaXQobm9kZSkpCgpzb3VyY2UgPSAnJycKY2xhc3MgRm9vOgogICAgZGVmIG1ldGhvZDEoc2VsZik6CiAgICAgICAgcGFzcwogICAgZGVmIG1ldGhvZDIoc2VsZik6CiAgICAgICAgcGFzcwoKY2xhc3MgQmFyOgogICAgZGVmIG1ldGhvZDEoc2VsZik6CiAgICAgICAgcGFzcwogICAgZGVmIG1ldGhvZDIoc2VsZik6CiAgICAgICAgcGFzcwonJycKcHJpbnQoYnVpbGRfdHJlZShhc3QucGFyc2Uoc291cmNlKSkp