<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 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