code: def construct_arguments(self, args, kwargs, options, bound=False):
          
          expected_args = self._get_expected_args(bound)
          self._assert_no_unexpected_args(expected_args, args)
          self._assert_no_unexpected_kwargs(expected_args, kwargs)
          self._assert_no_duplicate_args(expected_args, args, kwargs)
  
          args, kwargs = self._fill_in_options(args, kwargs, options, bound)
  
          self._assert_no_missing_args(args, kwargs, bound)
          return args, kwargs
docs: Construct args list and kwargs dictionary for this signature.
  
          They are created such that:
            - the original explicit call arguments (args, kwargs) are preserved
            - missing arguments are filled in by name using options (if possible)
            - default arguments are overridden by options
            - TypeError is thrown if:
              * kwargs contains one or more unexpected keyword arguments
              * conflicting values for a parameter in both args and kwargs
              * there is an unfilled parameter at the end of this process