code: def get_method_sig(method):
      
  
      # The return value of ArgSpec is a bit weird, as the list of arguments and
      # list of defaults are returned in separate array.
      # eg: ArgSpec(args=['first_arg', 'second_arg', 'third_arg'],
      # varargs=None, keywords=None, defaults=(42, 'something'))
      argspec = inspect.getargspec(method)
      arg_index=0
      args = []
  
      # Use the args and defaults array returned by argspec and find out
      # which arguments has default
      for arg in argspec.args:
          default_arg = _get_default_arg(argspec.args, argspec.defaults, arg_index)
          if default_arg.has_default:
              val = default_arg.default_value
              if isinstance(val, basestring):
                  val = '"' + val + '"'
              args.append("%s=%s" % (arg, val))
          else:
              args.append(arg)
          arg_index += 1
      if argspec.varargs:
          args.append('*' + argspec.varargs)
      if argspec.keywords:
          args.append('**' + argspec.keywords)
      return "%s(%s)" % (method.__name__, ", ".join(args[1:]))
docs: Given a function, it returns a string that pretty much looks how the
      function signature would be written in python.
  
      :param method: a python method
      :return: A string similar describing the pythong method signature.
      eg: "my_method(first_argArg, second_arg=42, third_arg='something')"