code: def retrieve_data_string(data, verbose=True, data_args=None):
      data_string = inspect.getsource(data)
      first_line = data_string.split("\n")[0]
      indent_length = len(determine_indent(data_string))
      data_string = data_string.replace(first_line, "")
      r = re.compile(r"^\s*return.*")
      last_line = [
          s for s in reversed(data_string.split("\n")) if r.match(s)
      ][0]
      data_string = data_string.replace(last_line, "")
  
      required_arguments = inspect.getfullargspec(data).args
      if required_arguments:
          if data_args is None:
              raise ValueError(
                  "Data function takes arguments {} but no values are passed via data_args".format(
                      required_arguments
                  )
              )
          data_string = (
              "\n".join(
                  "    {} = {}".format(x, repr(y))
                  for x, y in zip(required_arguments, data_args)
              )
              + data_string
          )
      split_data = data_string.split("\n")
      for i, line in enumerate(split_data):
          split_data[i] = line[indent_length:] + "\n"
      data_string = "".join(split_data)
      if verbose:
          print(">>> Data")
          print(with_line_numbers(data_string))
      return data_string
  
imports: import inspect
  import os
  import re
  import sys
  import nbformat
  import numpy
  from hyperopt import fmin
  from nbconvert import PythonExporter
  from .ensemble import VotingModel
  from .utils import remove_imports, remove_all_comments, extract_imports, temp_string, write_temp_files, determine_indent, with_line_numbers, unpack_hyperopt_vals, eval_hyperopt_space, find_signature_end
label_desc: Use image node_id 7 for calling a global function with example usage: retrieve_data_string(data, verbose, data_args) and returns: data_string