docstr: Takes a function (or method) and documents it.
  
  Args:
      clsname (str, optional): class name to prepend to funcname.
      depth (int, optional): number of ### to append to function name
docstr_tok: ["Takes","a","function","(","or","method",")","and","documents","it",".","Args",":","clsname","(","str",",","optional",")",":","class","name","to","prepend","to","funcname",".","depth","(","int",",","optional",")",":","number","of","#","#","#","to","append","to","function","name"]
code: def func2md(self, func, clsname=None, names=None, depth=3):
      """Takes a function (or method) and documents it.
  
      Args:
          clsname (str, optional): class name to prepend to funcname.
          depth (int, optional): number of ### to append to function name
  
      """
      section = "#" * depth
      if names is None:
          names = [func.__name__]
  
      funcname = ", ".join(names)
      escfuncname = ", ".join(
          [
              "`%s`" % funcname
              if funcname.startswith("_")
              else funcname
              for funcname in names
          ]
      )
      header = "%s%s" % (
          "%s." % clsname if clsname else "",
          escfuncname,
      )
  
      path = self.get_src_path(func)
      doc = self.doc2md(func)
  
      args, kwargs = [], []
      spec = getargspec(func)
      vargsname, kwargsname = spec.varargs, spec.keywords
      vargs = list(make_iter(spec.args)) if spec.args else []
      defaults = list(make_iter(spec.defaults)) if spec.defaults else []
  
      while vargs:
          if vargs and vargs[0] == "self":
              args.append(vargs.pop(0))
          elif len(vargs) > len(defaults):
              args.append(vargs.pop(0))
          else:
              default = defaults.pop(0)
              if isinstance(default, str):
                  default = '"%s"' % default
              else:
                  default = "%s" % str(default)
  
              kwargs.append((vargs.pop(0), default))
  
      if args:
          args = ", ".join("%s" % arg for arg in args)
      if kwargs:
          kwargs = ", ".join("%s=%s" % kwarg for kwarg in kwargs)
          if args:
              kwargs = ", " + kwargs
      if vargsname:
          vargsname = "*%s" % vargsname
          if args or kwargs:
              vargsname = ", " + vargsname
      if kwargsname:
          kwargsname = "**%s" % kwargsname
          if args or kwargs or vargsname:
              kwargsname = ", " + kwargsname
  
      _FUNCDEF = "{funcname}({args}{kwargs}{vargs}{vkwargs})"
      funcdef = _FUNCDEF.format(
          funcname=funcname,
          args=args or "",
          kwargs=kwargs or "",
          vargs=vargsname or "",
          vkwargs=kwargsname or "",
      )
  
      # split the function definition if it is too long
      lmax = 90
      if len(funcdef) > lmax:
          # wrap in the args list
          split = funcdef.split("(", 1)
          # we gradually build the string again
          rest = split[1]
          args = rest.split(", ")
  
          funcname = "(".join(split[:1]) + "("
          lline = len(funcname)
          parts = []
          for arg in args:
              larg = len(arg)
              if larg > lmax - 5:
                  # not much to do if arg is so long
                  parts.append(arg)
              elif lline + larg > lmax:
                  # the next arg is too long, break the line
                  parts.append("\\\n    " + arg)
                  lline = 0
              else:
                  parts.append(arg)
              lline += len(parts[-1])
          funcdef = funcname + ", ".join(parts)
  
      # build the signature
      string = FUNC_TEMPLATE.format(
          section=section,
          header=header,
          funcdef=funcdef,
          path=path,
          doc=doc if doc else "*No documentation found.*",
      )
      return string
  
file_path: keras-vis/docs/md_autogen.py
imports: import os
  import re
  import inspect
  from inspect import getdoc, getargspec, getsourcefile, getsourcelines, getmembers
  from collections import defaultdict
  import sys
label_desc: Use image node_id 5 for calling the MarkdownAPIGenerator obj's underlying member method code with example usage: obj.func2md(func, clsname, names, depth) and returns: string