code: def join(left, right, predicates=(), how='inner'):
      
      klass = _join_classes[how.lower()]
      if isinstance(predicates, Expr):
          predicates = _L.flatten_predicate(predicates)
  
      op = klass(left, right, predicates)
      return op.to_expr()
docs: 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