code: def getargspec_no_self(func):
      
      sig = inspect.signature(func)
      args = [
          p.name for p in sig.parameters.values()
          if p.kind == inspect.Parameter.POSITIONAL_OR_KEYWORD
      ]
      varargs = [
          p.name for p in sig.parameters.values()
          if p.kind == inspect.Parameter.VAR_POSITIONAL
      ]
      varargs = varargs[0] if varargs else None
      varkw = [
          p.name for p in sig.parameters.values()
          if p.kind == inspect.Parameter.VAR_KEYWORD
      ]
      varkw = varkw[0] if varkw else None
      defaults = [
          p.default for p in sig.parameters.values()
          if (p.kind == inspect.Parameter.POSITIONAL_OR_KEYWORD and
             p.default is not p.empty)
      ] or None
  
      if args[0] == 'self':
          args.pop(0)
  
      return ArgSpec(args, varargs, varkw, defaults)
docs: inspect.getargspec replacement using inspect.signature.
  
      inspect.getargspec is deprecated in python 3. This is a replacement
      based on the (new in python 3.3) `inspect.signature`.
  
      Parameters
      ----------
      func : callable
          A callable to inspect
  
      Returns
      -------
      argspec : ArgSpec(args, varargs, varkw, defaults)
          This is similar to the result of inspect.getargspec(func) under
          python 2.x.
          NOTE: if the first argument of `func` is self, it is *not*, I repeat
          *not* included in argspec.args.
          This is done for consistency between inspect.getargspec() under
          python 2.x, and inspect.signature() under python 3.x.