docs: def _validate_value_types(self, **kwargs):
          """Raises a TypeError for non-string values.
  
          The only legal non-string value if we allow valueless
          options is None, so we need to check if the value is a
          string if:
          - we do not allow valueless options, or
          - we allow valueless options but the value is not None
  
          For compatibility reasons this method is not used in classic set()
          for RawConfigParsers. It is invoked in every case for mapping protocol
          access and in ConfigParser.set().
          """
          # keyword-only arguments
          section = kwargs.get('section', "")
          option = kwargs.get('option', "")
          value = kwargs.get('value', "")
  
          if PY2 and bytes in (type(section), type(option), type(value)):
              # we allow for a little unholy magic for Python 2 so that
              # people not using unicode_literals can still use the library
              # conveniently
              warnings.warn(
                  "You passed a bytestring. Implicitly decoding as UTF-8 string."
                  " This will not work on Python 3. Please switch to using"
                  " Unicode strings across the board.",
                  DeprecationWarning,
                  stacklevel=2,
              )
              if isinstance(section, bytes):
                  section = section.decode('utf8')
              if isinstance(option, bytes):
                  option = option.decode('utf8')
              if isinstance(value, bytes):
                  value = value.decode('utf8')
  
          if not isinstance(section, str):
              raise TypeError("section names must be strings")
          if not isinstance(option, str):
              raise TypeError("option keys must be strings")
          if not self._allow_no_value or value:
              if not isinstance(value, str):
                  raise TypeError("option values must be strings")
  
          return section, option, value