code: def _process_tools_arg(plot, tools, tooltips=None):
      
      tool_objs = []
      tool_map = {}
      temp_tool_str = ""
      repeated_tools = []
  
      if isinstance(tools, (list, tuple)):
          for tool in tools:
              if isinstance(tool, Tool):
                  tool_objs.append(tool)
              elif isinstance(tool, string_types):
                  temp_tool_str += tool + ','
              else:
                  raise ValueError("tool should be a string or an instance of Tool class")
          tools = temp_tool_str
  
      for tool in re.split(r"\s*,\s*", tools.strip()):
          # re.split will return empty strings; ignore them.
          if tool == "":
              continue
  
          tool_obj = _tool_from_string(tool)
          tool_objs.append(tool_obj)
          tool_map[tool] = tool_obj
  
      for typename, group in itertools.groupby(
              sorted(tool.__class__.__name__ for tool in tool_objs)):
          if len(list(group)) > 1:
              repeated_tools.append(typename)
  
      if repeated_tools:
          warnings.warn("%s are being repeated" % ",".join(repeated_tools))
  
      if tooltips is not None:
          for tool_obj in tool_objs:
              if isinstance(tool_obj, HoverTool):
                  tool_obj.tooltips = tooltips
                  break
          else:
              tool_objs.append(HoverTool(tooltips=tooltips))
  
      return tool_objs, tool_map
docs: Adds tools to the plot object
  
      Args:
          plot (Plot): instance of a plot object
          tools (seq[Tool or str]|str): list of tool types or string listing the
              tool names. Those are converted using the _tool_from_string
              function. I.e.: `wheel_zoom,box_zoom,reset`.
          tooltips (string or seq[tuple[str, str]], optional):
              tooltips to use to configure a HoverTool
  
      Returns:
          list of Tools objects added to plot, map of supplied string names to tools