def fold_mult_right(self, node): if not isinstance(node.right, (ast.List, ast.Tuple)): return False if not isnum(node.left): return False # FIXME: remove that check once we have a proper type inference engine if not isintegral(node.left): raise PythranSyntaxError("Multiplying a sequence by a float", node) return isinstance(node.op, ast.Mult)
def visit_Subscript(self, node): """ >>> import gast as ast >>> from pythran import passmanager, backend >>> pm = passmanager.PassManager("test") >>> node = ast.parse("def foo(a): a[1:][3]") >>> _, node = pm.apply(PartialConstantFolding, node) >>> _, node = pm.apply(ConstantFolding, node) >>> print(pm.dump(backend.Python, node)) def foo(a): a[4] >>> node = ast.parse("def foo(a): a[::2][3]") >>> _, node = pm.apply(PartialConstantFolding, node) >>> _, node = pm.apply(ConstantFolding, node) >>> print(pm.dump(backend.Python, node)) def foo(a): a[6] >>> node = ast.parse("def foo(a): a[-4:][5]") >>> _, node = pm.apply(PartialConstantFolding, node) >>> _, node = pm.apply(ConstantFolding, node) >>> print(pm.dump(backend.Python, node)) def foo(a): a[1] """ self.generic_visit(node) if not isinstance(node.value, ast.Subscript): return node if not isinstance(node.value.slice, ast.Slice): return node if not isintegral(node.slice): return node slice_ = node.value.slice index = node.slice node = node.value lower = slice_.lower or ast.Constant(0, None) step = slice_.step or ast.Constant(1, None) node.slice = ast.BinOp(lower, ast.Add(), ast.BinOp(index, ast.Mult(), step)) self.update = True return node