docs: def _filterArgs(args, kwargs, inputSpec, outputSpec):
      """
      Filter out arguments that were passed to input that output won't accept.
  
      :param tuple args: The *args that input received.
      :param dict kwargs: The **kwargs that input received.
      :param ArgSpec inputSpec: The input's arg spec.
      :param ArgSpec outputSpec: The output's arg spec.
      :return: The args and kwargs that output will accept.
      :rtype: Tuple[tuple, dict]
      """
      named_args = tuple(zip(inputSpec.args[1:], args))
      if outputSpec.varargs:
          # Only return all args if the output accepts *args.
          return_args = args
      else:
          # Filter out arguments that don't appear
          # in the output's method signature.
          return_args = [v for n, v in named_args if n in outputSpec.args]
  
      # Get any of input's default arguments that were not passed.
      passed_arg_names = tuple(kwargs)
      for name, value in named_args:
          passed_arg_names += (name, value)
      defaults = zip(inputSpec.args[::-1], inputSpec.defaults[::-1])
      full_kwargs = {n: v for n, v in defaults if n not in passed_arg_names}
      full_kwargs.update(kwargs)
  
      if outputSpec.varkw:
          # Only pass all kwargs if the output method accepts **kwargs.
          return_kwargs = full_kwargs
      else:
          # Filter out names that the output method does not accept.
          all_accepted_names = outputSpec.args[1:] + outputSpec.kwonlyargs
          return_kwargs = {n: v for n, v in full_kwargs.items()
                           if n in all_accepted_names}
  
      return return_args, return_kwargs