docs: def prepare_data(content, mode, encoding, version=None):
      """\
      Returns an iterable of `Segment` instances.
  
      If `content` is a string, an integer, or bytes, the returned tuple will
      have a single item. If `content` is a list or a tuple, a tuple of
      `Segment` instances of the same length is returned.
  
      :param content: Either a string, bytes, an integer or an iterable.
      :type content: str, bytes, int, tuple, list or any iterable
      :param mode: The global mode. If `content` is list/tuple, the `Segment`
              instances may have a different mode.
      :param encoding: The global encoding. If `content` is a list or a tuple,
              the `Segment` instances may have a different encoding.
      :param int version: Version constant or ``None``. This refers to the version
                  which was provided by the user.
      :rtype: Segments
      """
      segments = Segments()
      add_segment = segments.add_segment
      if isinstance(content, (str_type, bytes, numeric)):
          add_segment(make_segment(content, mode, encoding))
          return segments
      for item in content:
          seg_content, seg_mode, seg_encoding = item, mode, encoding
          if isinstance(item, tuple):
              seg_content = item[0]
              if len(item) > 1:
                  seg_mode = item[1] or mode  # item[1] could be None
              if len(item) > 2:
                  seg_encoding = item[2] or encoding # item[2] may be None
          add_segment(make_segment(seg_content, seg_mode, seg_encoding))
      return segments