def build_Compare(ctx, expr): operands = [ build_expr(ctx, e) for e in [expr.left] + list(expr.comparators) ] result = None for lhs, op_, rhs in zip(operands, expr.ops, operands[1:]): op = type(op_) op_token = ExprBuilder.cmpop_map.get(op) r = ctx.make_raw_range(lhs.range().end, rhs.range().start) if op_token is None: raise NotSupportedError( r, "unsupported comparison operator: " + op.__name__) if op == ast.NotIn: # NB: `not in` is just `not( in )`, so we don't introduce new tree view # but just make it a nested call in our tree view structure in_expr = BinOp('in', lhs, rhs) cmp_expr = UnaryOp(r, 'not', in_expr) else: cmp_expr = BinOp(op_token, lhs, rhs) if result is None: result = cmp_expr else: result = BinOp('and', result, cmp_expr) return result
def build_BoolOp(ctx, expr): if len(expr.values) < 2: raise AssertionError("expected at least 2 values in BoolOp, but got " + str(len(expr.values))) sub_exprs = [build_expr(ctx, sub_expr) for sub_expr in expr.values] op = type(expr.op) op_token = ExprBuilder.boolop_map.get(op) if op_token is None: err_range = ctx.make_raw_range(sub_exprs[0].range().end, sub_exprs[1].range().start) raise NotSupportedError(err_range, "unsupported boolean operator: " + op.__name__) lhs = sub_exprs[0] for rhs in sub_exprs[1:]: lhs = BinOp(op_token, lhs, rhs) return lhs
def build_BinOp(ctx, expr): lhs = build_expr(ctx, expr.left) rhs = build_expr(ctx, expr.right) op = type(expr.op) if op == ast.Div and not ctx.uses_true_division: err_range = ctx.make_raw_range(lhs.range().end, rhs.range().start) raise FrontendError(err_range, 'Division of ints in TorchScript uses Python 3 true ' 'division semantics. Please put `from __future__ ' 'import division` at the top of your file') op_token = ExprBuilder.binop_map.get(op) if op_token is None: err_range = ctx.make_raw_range(lhs.range().end, rhs.range().start) raise NotSupportedError(err_range, "unsupported binary operator: " + op.__name__) return BinOp(op_token, lhs, rhs)