code: def _get_func_and_its_called_func_source_code(func) -> List[str]:
      """
      给定一个func，返回在这个函数里面用到的所有函数的源码。
  
      :param callable func:
      :return:
      """
      last_frame = inspect.currentframe().f_back.f_back.f_back
      last_frame_f_local = last_frame.f_locals
      last_frame_loc = {}
      if "loc" in last_frame_f_local:
          last_frame_loc = last_frame_f_local["loc"]
      func_calls = list(
          set(
              get_func_calls(
                  ast.parse(
                      truncate_start_blanks(inspect.getsource(func))
                  )
              )
          )
      )
      func_calls.sort()
      sources = []
      for _func_name in func_calls:
          try:
              if _func_name == "cache_results":  # ignore the decorator
                  continue
              if "." in _func_name:
                  _funcs = _func_name.split(".")
              else:
                  _funcs = [_func_name]
              if (
                  _funcs[0] in last_frame_f_local
                  or _funcs[0] in last_frame_loc
              ):
                  tmp = _funcs.pop(0)
                  variable = last_frame_f_local.get(
                      tmp, last_frame_loc.get(tmp)
                  )
                  while len(_funcs) or variable is not None:
                      if hasattr(
                          variable, "__class__"
                      ) and not inspect.isbuiltin(variable.__class__):
                          try:
                              sources.append(
                                  inspect.getsource(variable.__class__)
                              )
                          except TypeError:
                              pass
                      if callable(variable) or inspect.isclass(
                          variable
                      ):
                          sources.append(inspect.getsource(variable))
                      if len(_funcs):
                          tmp = _funcs.pop(0)
                          if hasattr(variable, tmp):
                              variable = getattr(variable, tmp)
                          else:
                              break
                      else:
                          variable = None
          except:
              # some failure
              pass
      del last_frame  #
      func_source_code = inspect.getsource(
          func
      )  # 将这个函数中的 cache_results 装饰删除掉。
      for match in list(
          re.finditer("@cache_results\(.*\)\\n", func_source_code)
      )[::-1]:
          func_source_code = (
              func_source_code[: match.start()]
              + func_source_code[match.end() :]
          )
      sources.append(func_source_code)
      return sources
  
imports: from datetime import datetime
  import hashlib
  import _pickle
  import functools
  import os
  import re
  from typing import Callable, List, Any, Optional
  import inspect
  import ast
  from collections import deque
  from fastNLP.core.log.logger import logger
  from fastNLP.core.log.highlighter import ColorHighlighter
  from .utils import _get_fun_msg
label_desc: Use image node_id 3 for calling a global function with example usage: _get_func_and_its_called_func_source_code(func) and returns: sources