code: def set_value(self, value):
          
          if value == self.user_value:
              # We know the value must be valid if it was successfully set
              # previously
              self._was_set = True
              return True
  
          if not ((self.orig_type is BOOL     and value in (2, 0, "y", "n")        ) or
                  (self.orig_type is TRISTATE and value in (2, 1, 0, "y", "m", "n"))):
  
              # Display tristate values as n, m, y in the warning
              self.kconfig._warn(
                  "the value {} is invalid for {}, which has type {} -- "
                  "assignment ignored"
                  .format(TRI_TO_STR[value] if value in (0, 1, 2) else
                              "'{}'".format(value),
                          _name_and_loc(self),
                          TYPE_TO_STR[self.orig_type]))
  
              return False
  
          if value in ("y", "m", "n"):
              value = STR_TO_TRI[value]
  
          self.user_value = value
          self._was_set = True
          self._rec_invalidate()
  
          return True
docs: Sets the user value (mode) of the choice. Like for Symbol.set_value(),
          the visibility might truncate the value. Choices without the 'optional'
          attribute (is_optional) can never be in n mode, but 0/"n" is still
          accepted since it's not a malformed value (though it will have no
          effect).
  
          Returns True if the value is valid for the type of the choice, and
          False otherwise. This only looks at the form of the value. Check the
          Choice.assignable attribute to see what values are currently in range
          and would actually be reflected in the mode of the choice.