code: def getargs(obj):
      
      if inspect.isfunction(obj) or inspect.isbuiltin(obj):
          func_obj = obj
      elif inspect.ismethod(obj):
          func_obj = get_meth_func(obj)
      elif inspect.isclass(obj) and hasattr(obj, '__init__'):
          func_obj = getattr(obj, '__init__')
      else:
          return []
      if not hasattr(func_obj, 'func_code'):
          # Builtin: try to extract info from doc
          args = getargsfromdoc(func_obj)
          if args is not None:
              return args
          else:
              # Example: PyQt5
              return getargsfromdoc(obj)
      args, _, _ = inspect.getargs(func_obj.func_code)
      if not args:
          return getargsfromdoc(obj)
      
      # Supporting tuple arguments in def statement:
      for i_arg, arg in enumerate(args):
          if isinstance(arg, list):
              args[i_arg] = "(%s)" % ", ".join(arg)
              
      defaults = get_func_defaults(func_obj)
      if defaults is not None:
          for index, default in enumerate(defaults):
              args[index+len(args)-len(defaults)] += '='+repr(default)
      if inspect.isclass(obj) or inspect.ismethod(obj):
          if len(args) == 1:
              return None
          if 'self' in args:
              args.remove('self')
      return args
docs: Get the names and default values of a function's arguments