From 2bd7b74891c0ffc95e7a102bf52da39ca99f49e4 Mon Sep 17 00:00:00 2001 From: RedTailedHawk Date: Tue, 10 Feb 2015 10:40:14 -0500 Subject: [PATCH 1/2] Some modifications so PyDev doesn't complain: - Added a space to some indentations - Created functions for visit_List and visit_Set, which call __sequence_visit - Created functions for visit_ListComp, visit_GeneratorExp and visit_SetComp, which call __generator_visit --- codegen.py | 56 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 29 insertions(+), 27 deletions(-) diff --git a/codegen.py b/codegen.py index 113d9be..4d38132 100644 --- a/codegen.py +++ b/codegen.py @@ -145,8 +145,8 @@ def visit_Assert(self, node): self.write('assert ') self.visit(node.test) if node.msg is not None: - self.write(', ') - self.visit(node.msg) + self.write(', ') + self.visit(node.msg) def visit_Assign(self, node): self.newline(node) @@ -414,19 +414,19 @@ def visit_Tuple(self, node): self.visit(item) self.write(idx and ')' or ',)') - def sequence_visit(left, right): - def visit(self, node): - self.write(left) - for idx, item in enumerate(node.elts): - if idx: - self.write(', ') - self.visit(item) - self.write(right) - return visit + def __sequence_visit(self, left, right, node): + self.write(left) + for idx, item in enumerate(node.elts): + if idx: + self.write(', ') + self.visit(item) + self.write(right) + + def visit_List(self, node): + self.__sequence_visit('[', ']', node) - visit_List = sequence_visit('[', ']') - visit_Set = sequence_visit('{', '}') - del sequence_visit + def visit_Set(self, node): + self.__sequence_visit('{', '}', node) def visit_Dict(self, node): self.write('{') @@ -504,19 +504,21 @@ def visit_Lambda(self, node): def visit_Ellipsis(self, node): self.write('Ellipsis') - def generator_visit(left, right): - def visit(self, node): - self.write(left) - self.visit(node.elt) - for comprehension in node.generators: - self.visit(comprehension) - self.write(right) - return visit - - visit_ListComp = generator_visit('[', ']') - visit_GeneratorExp = generator_visit('(', ')') - visit_SetComp = generator_visit('{', '}') - del generator_visit + def __generator_visit(self, left, right, node): + self.write(left) + self.visit(node.elt) + for comprehension in node.generators: + self.visit(comprehension) + self.write(right) + + def visit_ListComp(self, node): + self.__generator_visit('[', ']', node) + + def visit_GeneratorExp(self, node): + self.__generator_visit('(', ')', node) + + def visit_SetComp(self, node): + self.__generator_visit('{', '}', node) def visit_DictComp(self, node): self.write('{') From 9de8e5421d19983af24517fa09a433e37ecc2dd3 Mon Sep 17 00:00:00 2001 From: RedTailedHawk Date: Thu, 19 Feb 2015 10:38:03 -0500 Subject: [PATCH 2/2] Parentheses are now generated in visit_BinOp. For the following example: print codegen.to_source(ast.parse("(1 + 2) * 3", mode="eval")) Instead of this: 1 + 2 * 3 # evaluates to 7, which is incorrect We now get this: ((1 + 2) * 3) # evaluates to 9, which is correct The generated expression contains a couple more parens than the original expression, but it yields the correct answer. --- codegen.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/codegen.py b/codegen.py index 4d38132..1bbbf06 100644 --- a/codegen.py +++ b/codegen.py @@ -439,9 +439,11 @@ def visit_Dict(self, node): self.write('}') def visit_BinOp(self, node): + self.write('(') self.visit(node.left) self.write(' %s ' % BINOP_SYMBOLS[type(node.op)]) self.visit(node.right) + self.write(')') def visit_BoolOp(self, node): self.write('(')