code: def update(self, params, ignore_set=False, overwrite=False):
          
          log = logging.getLogger(__name__)
          valid = {i[0] for i in self}
          for key, value in params.items():
              if not hasattr(self, key):
                  raise AttributeError("'{}' object has no attribute '{}'".format(self.__class__.__name__, key))
              if key not in valid:
                  message = "'{}' object does not support item assignment on '{}'"
                  raise AttributeError(message.format(self.__class__.__name__, key))
              if key in self._already_set:
                  if ignore_set:
                      log.debug('%s already set in config, skipping.', key)
                      continue
                  if not overwrite:
                      message = "'{}' object does not support item re-assignment on '{}'"
                      raise AttributeError(message.format(self.__class__.__name__, key))
              setattr(self, key, value)
              self._already_set.add(key)
docs: Set instance values from dictionary.
  
          :param dict params: Click context params.
          :param bool ignore_set: Skip already-set values instead of raising AttributeError.
          :param bool overwrite: Allow overwriting already-set values.