def test_lambda_replace_simple_expression(): a1 = ast.parse("lambda x: x") nexpr = ast.parse("lambda y: y + 1") expr = lambda_unwrap(nexpr).body a2 = lambda_body_replace(lambda_unwrap(a1), expr) a2_txt = ast.dump(a2) assert "op=Add(), right=Num(n=1))" in a2_txt
def test_lambda_replace_simple_expression(): a1 = ast.parse("lambda x: x") nexpr = ast.parse("lambda y: y + 1") expr = lambda_unwrap(nexpr).body a2 = lambda_body_replace(lambda_unwrap(a1), expr) a2_txt = ast.dump(a2) if sys.version_info < (3, 8): assert "op=Add(), right=Num(n=1))" in a2_txt elif sys.version_info < (3, 9): assert "op=Add(), right=Constant(value=1, kind=None))" in a2_txt else: assert "op=Add(), right=Constant(value=1))" in a2_txt
def visit_Select_of_SelectMany(self, parent, selection): r''' seq.SelectMany(x: f(x)).Select(y: g(y)) => Select(SelectMany(seq, x: f(x)), y: g(y)) is turned into seq.SelectMany(x: f(x).Select(y: g(y))) => SelectMany(seq, x: Select(f(x), y: g(y))) ''' func_g = selection func_f = parent.selection return self.visit( SelectMany( parent.source, lambda_body_replace(func_f, make_Select(lambda_body(func_f), func_g))))
def visit_Where_of_SelectMany(self, parent, filter): ''' seq.SelectMany(x: f(x)).Where(y: g(y)) => Where(SelectMany(seq, x: f(x)), y: g(y)) Is turned into: seq.SelectMany(x: f(x).Where(y: g(y))) => SelectMany(seq, x: Where(f(x), g(y))) ''' func_f = parent.selection func_g = filter seq = parent.source return self.visit( SelectMany( seq, lambda_body_replace(func_f, Where(lambda_body(func_f), func_g))))
def visit_Select_of_SelectMany(self, parent, selection): r''' seq.SelectMany(x: f(x)).Select(y: g(y)) => Select(SelectMany(seq, x: f(x)), y: g(y)) is turned into seq.SelectMany(x: f(x).Select(y: g(y))) => SelectMany(seq, x: Select(f(x), y: g(y))) ''' (_, args) = unpack_Call(parent) source = args[0] func_f = args[1] assert isinstance(func_f, ast.Lambda) func_g = selection lambda_select = \ lambda_body_replace(func_f, make_Select(lambda_body(func_f), func_g)) # type: ast.AST return self.visit(function_call('SelectMany', [source, lambda_select]))
def visit_Where_of_SelectMany(self, parent, filter): ''' seq.SelectMany(x: f(x)).Where(y: g(y)) => Where(SelectMany(seq, x: f(x)), y: g(y)) Is turned into: seq.SelectMany(x: f(x).Where(y: g(y))) => SelectMany(seq, x: Where(f(x), g(y))) ''' _, args = unpack_Call(parent) seq = args[0] func_f = args[1] assert isinstance(func_f, ast.Lambda) func_g = filter lambda_where = lambda_body_replace( func_f, function_call("Where", [lambda_body(func_f), func_g])) return self.visit(function_call('SelectMany', [seq, lambda_where]))
def visit_SelectMany_of_SelectMany(self, parent, selection): ''' Transformation #1: seq.SelectMany(x: f(x)).SelectMany(y: f(y)) => SelectMany(SelectMany(seq, x: f(x)), y: f(y)) is turned into: seq.SelectMany(x: f(x).SelectMany(y: f(y))) => SelectMany(seq, x: SelectMany(f(x), y: f(y))) ''' # TODO: Get to the point we can actually test that this works correctly raise BaseException('untested') func_g = selection func_f = parent.selection return self.visit( SelectMany( parent.source, lambda_body_replace(func_f, SelectMany(lambda_body(func_f), func_g))))