<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def join(left, right, predicates=(), how='inner'):
 """Perform a relational join between two tables. Does not resolve resulting table schema. Parameters left : TableExpr right : TableExpr predicates : join expression(s) how : string, default 'inner' - 'inner': inner join - 'left': left join - 'outer': full outer join - 'right': right outer join - 'semi' or 'left_semi': left semi join - 'anti': anti join Returns ------- joined : TableExpr Note that the schema is not materialized yet """

    klass = _join_classes[how.lower()]
    if isinstance(predicates, Expr):
        predicates = _L.flatten_predicate(predicates)

    op = klass(left, right, predicates)
    return op.to_expr()