def show_ast(tree): if rich_output(): import showast # We can import showast only when in a notebook return showast.show_ast(tree) else: import ast # Textual alternative print(ast.dump(tree))
def show_ast(tree: AST) -> Optional[Any]: if rich_output(): import showast # We can import showast only when in a notebook return showast.show_ast(tree) else: import ast # Textual alternative111 print(ast.dump(tree)) return None
xy_ast = ast.parse('x+y') from .bookutils import rich_output if __name__ == '__main__': if rich_output(): # Normally, this will do from showast import show_ast else: def show_ast(tree): ast.dump(tree, indent=4) if __name__ == '__main__': show_ast(xy_ast) if __name__ == '__main__': xy_ast if __name__ == '__main__': xy_ast.body[0] if __name__ == '__main__': xy_ast.body[0].value # type: ignore def get_expression(src): return ast.parse(src).body[0].value
if __name__ == '__main__': print_content(my_sqrt_source, '.py') if __name__ == '__main__': my_sqrt_ast = ast.parse(my_sqrt_source) if __name__ == '__main__': print(ast.dump(my_sqrt_ast, indent=4)) from .bookutils import rich_output if __name__ == '__main__': if rich_output(): import showast showast.show_ast(my_sqrt_ast) if __name__ == '__main__': print_content(ast.unparse(my_sqrt_ast), '.py') ### Annotating Functions with Given Types if __name__ == '__main__': print('\n### Annotating Functions with Given Types') def parse_type(name): class ValueVisitor(ast.NodeVisitor): def visit_Expr(self, node): self.value_node = node.value
if __name__ == "__main__": triangle_ast = ast.parse(triangle_source) if __name__ == "__main__": print(astor.dump_tree(triangle_ast)) if __package__ is None or __package__ == "": from fuzzingbook_utils import rich_output else: from .fuzzingbook_utils import rich_output if __name__ == "__main__": if rich_output(): import showast showast.show_ast(triangle_ast) if __name__ == "__main__": print_content(astor.to_source(triangle_ast), '.py') # ## A Simple Mutator for Functions if __name__ == "__main__": print('\n## A Simple Mutator for Functions') class MuFunctionAnalyzer: def __init__(self, fn, log=False): self.fn = fn self.name = fn.__name__ src = inspect.getsource(fn)
from .bookutils import rich_output if __name__ == "__main__": if rich_output(): from showast import show_ast else: def show_ast(tree): ast.dump(tree) if __name__ == "__main__": tree = ast.parse(source) if __name__ == "__main__": show_ast(tree) from ast import NodeTransformer, FunctionDef, fix_missing_locations if __name__ == "__main__": subtree_to_be_injected = ast.parse("print('entering function')") if __name__ == "__main__": show_ast(subtree_to_be_injected) if __name__ == "__main__": subtree_to_be_injected = subtree_to_be_injected.body[0] class InjectPass(NodeTransformer): def visit_FunctionDef(self, node):
if __package__ is None or __package__ == "": from bookutils import rich_output else: from .bookutils import rich_output if __name__ == "__main__": if rich_output(): from showast import show_ast else: def show_ast(tree): ast.dump(tree) if __name__ == "__main__": show_ast(fun_tree) if __name__ == "__main__": test_source = ( '''if remove_html_markup('<foo>bar</foo>') != 'bar':\n''' + ''' raise RuntimeError("Missing functionality")\n''' + '''assert remove_html_markup('"foo"') == '"foo"', "My Test"''') if __name__ == "__main__": test_tree = ast.parse(test_source) if __name__ == "__main__": print_content(astor.to_source(test_tree), '.py') import copy