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_UnaryOp(ctx, expr): sub_expr = build_expr(ctx, expr.operand) op = type(expr.op) op_token = ExprBuilder.unop_map.get(op) if op_token is None: raise NotSupportedError(expr.range(), "unsupported unary operator: " + op.__name__) r = ctx.make_range(expr.lineno, expr.col_offset, expr.col_offset + len(op_token)) return UnaryOp(r, op_token, sub_expr)