docs: def __scan_func(self, args_info):
          """Collect information about accepted arguments in following format:
              (
                  (<argument name>, <accepted types and values>),
                  (<argument name>, <accepted types and values>),
                  ...
              )
  
          Args:
              args_info (inspect.FullArgSpec): Information about function
                  arguments.
          """
          # Process args.
          for i, accepted_arg_vals in enumerate(self.accepted_arg_values):
              # Wrap each accepted value in the list if yet not wrapped.
              accepted_arg_vals = self.__wrap_accepted_val(accepted_arg_vals)
              # Add default value (if exists) in list of accepted values.
              if args_info.defaults:
                  def_range = len(args_info.defaults) - len(args_info.args[i:])
                  if def_range >= 0:
                      self.optional_args.append(i)
                      accepted_value = args_info.defaults[def_range]
                      accepted_arg_vals.append(accepted_value)
              # Try to detect current argument name.
              if len(args_info.args) > i:
                  arg_name = args_info.args[i]
              else:
                  arg_name = None
                  self.optional_args.append(i)
              # Save info about current argument and his accepted values.
              self.accepted_args.append((arg_name, accepted_arg_vals))
          # Process kwargs.
          for arg_name, accepted_arg_vals in self.accepted_kwargs_values.items():
              # Wrap each accepted value in the list if yet not wrapped.
              accepted_arg_vals = self.__wrap_accepted_val(accepted_arg_vals)
              # Mark current argument as optional.
              i = len(self.accepted_args)
              self.optional_args.append(i)
              # Save info about current argument and his accepted values.
              self.accepted_args.append((arg_name, accepted_arg_vals))