code: def fn_signature(callable, 
                   argument_transform=(lambda name: name),
                   default_transform=(lambda name, value: "%s=%s" % 
                                                          (name, repr(value))),
                   vararg_transform=(lambda name: "*" + name),
                   kwargs_transform=(lambda name: "**" + name)):
      
      signature = []
      fn = get_fn(callable)
      avail_ac = fn_available_argcount(fn)
      kwargs = fn_kwargs(fn)
      argnames = fn_argnames(fn)
      for name in stop_at(argnames, avail_ac):
          if name in kwargs:
              signature.append(default_transform(name, kwargs[name]))
          else:
              signature.append(argument_transform(name))
      if fn_has_args(fn):
          if fn_has_kwargs(fn):
              signature.append(vararg_transform(argnames[-2]))
              signature.append(kwargs_transform(argnames[-1]))
          else:
              signature.append(vararg_transform(argnames[-1]))
      elif fn_has_kwargs(fn):
          signature.append(kwargs_transform(argnames[-1]))
  
      return signature
docs: Returns the signature of the provided callable as a tuple of strings.