<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def substring_evaluator(self, index):
 """ Evaluate the given substring match condition for the given user attributes. Args: index: Index of the condition to be evaluated. Returns: Boolean: - True if the condition value is a substring of the user attribute value. - False if the condition value is not a substring of the user attribute value. None: if the condition value isn't a string or the user attribute value isn't a string. """

    condition_name = self.condition_data[index][0]
    condition_value = self.condition_data[index][1]
    user_value = self.attributes.get(condition_name)

    if not isinstance(condition_value, string_types):
      self.logger.warning(audience_logs.UNKNOWN_CONDITION_VALUE.format(
        self._get_condition_json(index),
      ))
      return None

    if not isinstance(user_value, string_types):
      self.logger.warning(audience_logs.UNEXPECTED_TYPE.format(
          self._get_condition_json(index),
          type(user_value),
          condition_name
      ))
      return None

    return condition_value in user_value