code: def lineage(expr, container=Stack):
      
      if not isinstance(expr, ir.ColumnExpr):
          raise TypeError('Input expression must be an instance of ColumnExpr')
  
      c = container([(expr, expr._name)])
  
      seen = set()
  
      # while we haven't visited everything
      while c:
          node, name = c.get()
  
          if node not in seen:
              seen.add(node)
              yield node
  
          # add our dependencies to the container if they match our name
          # and are ibis expressions
          c.extend(
              (arg, getattr(arg, '_name', name))
              for arg in c.visitor(_get_args(node.op(), name))
              if isinstance(arg, ir.Expr)
          )
docs: Yield the path of the expression tree that comprises a column
      expression.
  
      Parameters
      ----------
      expr : Expr
          An ibis expression. It must be an instance of
          :class:`ibis.expr.types.ColumnExpr`.
      container : Container, {Stack, Queue}
          Stack for depth-first traversal, and Queue for breadth-first.
          Depth-first will reach root table nodes before continuing on to other
          columns in a column that is derived from multiple column. Breadth-
          first will traverse all columns at each level before reaching root
          tables.
  
      Yields
      ------
      node : Expr
          A column and its dependencies