示例#1
0
    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
示例#2
0
 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)