<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def _on_config_value_changed(self, renderer, path, new_value, config_m, list_store):
 """Callback handling a change of a config value :param Gtk.CellRenderer renderer: Cell renderer showing the shortcut :param path: Path of shortcuts within the list store :param ConfigModel config_m: The config model that is to be changed :param Gtk.ListStore list_store: The list store that is to be changed """

        config_key = list_store[int(path)][self.KEY_STORAGE_ID]
        old_value = config_m.get_current_config_value(config_key, use_preliminary=True)

        if old_value == new_value:
            return

        # Try to maintain the correct data type, which is extracted from the old value
        if isinstance(old_value, bool):
            if new_value in ["True", "true"]:
                new_value = True
            elif new_value in ["False", "false"]:
                new_value = False
            else:
                logger.warning("'{}' must be a boolean value".format(config_key))
                new_value = old_value
        elif isinstance(old_value, (int, float)):
            try:
                new_value = int(new_value)
            except ValueError:
                try:
                    new_value = float(new_value)
                except ValueError:
                    logger.warning("'{}' must be a numeric value".format(config_key))
                    new_value = old_value

        config_m.set_preliminary_config_value(config_key, new_value)